上周,在美國的BlackHat會議上宣布了一種針對PHP應(yīng)用程序的新漏洞利用方式。你可以在這篇文章中了解到它。
概要
來自Secarma的安全研究員Sam Thomas發(fā)現(xiàn)了一種新的漏洞利用方式,可以在不使用php函數(shù)unserialize()的前提下,引起嚴(yán)重的php對象注入漏洞。這個新的攻擊方式被他公開在了美國的BlackHat會議演講上,演講主題為:”不為人所知的php反序列化漏洞”。它可以使攻擊者將相關(guān)漏洞的嚴(yán)重程度升級為遠(yuǎn)程代碼執(zhí)行。我們在RIPS代碼分析引擎中添加了對這種新型攻擊的檢測。
流包裝
大多數(shù)PHP文件操作允許使用各種URL協(xié)議去訪問文件路徑:如data://,zlib://或php://。其中一些通常用于利用遠(yuǎn)程文件包含漏洞,攻擊者可以利用它們控制文件包含的完整路徑。例如,用于網(wǎng)站源代碼的讀取或者是用于代碼執(zhí)行:
include('php://filter/convert.base64-encode/resource=index.php');
include('data://text/plain;base64,cGhwaW5mbygpCg==');
Phar元數(shù)據(jù)
但到目前為止,沒有人關(guān)注phar://。Phar(PHP Archive)文件的有趣之處在于它包含序列化格式的元數(shù)據(jù)。讓我們創(chuàng)建一個Phar文件,并添加一個包含一些數(shù)據(jù)的對象作為元數(shù)據(jù):
// create new Phar
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('');
// add object of any class as meta data
class AnyClass {}
$object = new AnyClass;
$object->data = 'rips';
$phar->setMetadata($object);
$phar->stopBuffering();
我們新創(chuàng)建的test.phar文件現(xiàn)在具有以下內(nèi)容。我們可以看到我們的對象存儲為序列化字符串。

PHP對象注入
如果現(xiàn)在通過phar://對我們現(xiàn)有的Phar文件進行文件操作,則其序列化元數(shù)據(jù)將被反序列化。這意味著我們在元數(shù)據(jù)中注入的對象將被加載到應(yīng)用程序中。如果此應(yīng)用程序具有已命名的類AnyClass,并且具有魔術(shù)函數(shù)__destruct()或__wakeup(),則會自動調(diào)用這些方法。這意味著我們可以在代碼庫中觸發(fā)任何析構(gòu)函數(shù)或喚醒方法。更糟糕的是,如果這些魔法函數(shù)對我們注入的數(shù)據(jù)進行操作,那么這可能會導(dǎo)致進一步的漏洞:
class AnyClass {
function __destruct() {
echo $this->data;
}
}
// output: rips
include('phar://test.phar');
漏洞利用
首先,攻擊者必須能夠在目標(biāo)Web服務(wù)器上植入精心制作的Phar文件。而Sam Thomas發(fā)現(xiàn)了一些關(guān)于如何將Phar文件隱藏到JPG中的好技巧,因此常見的圖像上傳功能已足夠。
到目前為止,攻擊者如果可以控制諸如include(),fopen(),file_get_contents(),file()等文件操作的函數(shù),則可以造成嚴(yán)重的漏洞。因此,通常需要在這些函數(shù)使用前驗證用戶的輸入。
但是,phar://在任何文件操作中都會觸發(fā)反序列化。例如用file_exists()簡單地檢查文件的存在。這些函數(shù)一直被認(rèn)為不太可能引起安全問題,所以一直被保護的不夠好。
使用RIPS進行自動檢測
通過RIPS的污點分析,我們可以在PHP文件操作中自動檢測用戶輸入的未經(jīng)過濾或驗證的信息。這樣,我們即可檢測文件刪除、泄露、寫入、創(chuàng)建、包含(等等)漏洞。

此外,RIPS的上下文敏感字符串分析使我們能夠精確評估文件路徑是完全還是僅部分能被攻擊者控制,以及是否可以注入phar://。最后,RIPS能夠掃描可能導(dǎo)致對象注入漏洞的較短的攻擊鏈。我們在RIPS代碼分析器中添加了一個名為Phar Deserialization的新漏洞類型,以檢測這種新類型的代碼風(fēng)險。
|