PHP/7.3.11session伪造
www.zip
通过 /www.zip 扫描到源码,这里目录扫描全是 200,建议使用可以看到返回包大小的扫描器,或者有 404 页面识别的扫描器,比如 dirmap
日常吐槽 fortify,咋啥也扫不出来 (x
seay 发现 file_put_contents 输入可控
利用前提:
利用点是 session.serialize_handler 与 php.ini 的配置不同引起的反序列化,至于为什么不同,如果相同的也就没必要加上这句设置了(ini_set('session.serialize_handler', 'php');),毕竟是默认配置对吧
目标:
file_put_contents可控点在inc/inc.php在User类,可以通过反序列化触发__destruct
思路:
- 首先访问两次首页,抓包可以看到
Cookielimit参数,构造 exp ,使得我们的反序列化数据写入 session 文件(通过$_SESSION['limit']=base64_decode($_COOKIE['limit']);写入,这是PHP session 机制,可参考 此链接) - 因 
inc/inc.php存在ini_set('session.serialize_handler', 'php');和session_start();,只要访问即会获取之前写入的session数据,然后check.php包含inc/inc.php,即会触发User类的__destruct方法,从而把恶意数据通过file_put_contents写入名为log-$this.username,内容为$this.password的文件。 
poc
<?phpclass User{public $username = 'tari.php';public $password = '<?php system("cat flag.php") ?>';}$user = new User();echo(base64_encode('|'.serialize($user)));?>
这里加 '|' 是因为 session.serialize_handler 使用 php引擎 ,session 关联数组的 key 和 value 是通过 '|' 区分的, value 是需要被反序列化的部分。然后默认不是用 php 引擎,所以…. 所以写入是正常字符串,在 inc/inc.php 这读取语义又不一样了。
随便请求一下 check.php
注意是 log-tari.php !
flag
ctfshow{523efbab-b753-4d45-9eda-a54874346088}
