0x00 背景
在Blackhat2018,安全研究员Sam Thomas分享了议题It’s a PHP unserialization vulnerability Jim, but not as we know it,利用这种方法可以在不使用unserialize()函数的情况下触发PHP反序列化漏洞。
0x01 原理
漏洞触发点在使用phar://协议读取文件的时候,文件内容会被解析成phar对象,然后phar对象内的Metadata信息会被反序列化。当内核调用phar_parse_metadata()解析metadata数据时,会调用php_var_unserialize()对其进行反序列化操作,因此会造成反序列化漏洞。
0x02 漏洞利用
利用条件
- phar文件要能够上传到服务器端。
- 要有可用的魔术方法作为“跳板”。
- 文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。
下面的函数可以利用
测试demo
1 | //index.php |
可以看到foo是一个危险函数,当危险的对象被反序列化时eval会导致命令执行。这里正好有一个file_exists的文件操作函数,为了测试方便,我们直接生成phar文件放在index.php所在目录。
1 | //构造phar文件的代码 |
这里因为调用了phar的setMetadata方法,所以需要设置php.ini中phar.readonly = Off
而使用phar文件只需要(PHP 5 >= 5.3.0, PHP 7, PECL phar >= 1.0.0)即可。
这里生成的phar.phar可以修改为任意文件后缀,比如1.gif。
然后访问index.php,使用phar://读取
0x03 CTF题
1 |
|
参考文章:
https://www.cnblogs.com/iceli/p/9564061.html
https://paper.seebug.org/680/