PHP phar:協議物件注入技術介紹

IT168GB發表於2018-08-31

前言

在之前的BlackHat 2018大會上公佈了一款針對PHP應用程式的全新攻擊技術。我們將透過這篇文章簡單介紹下。

來自Secarma的安全研究員Sam Thomas發現了一種新的開發技術,它可以導致 ——而無需使用PHPunserialize()函式。這項新技術是在BlackHat 2018大會上公佈的,利用 升實現遠端程式碼執行。我們在RIPS程式碼分析引擎中新增了對這種新型攻擊的檢測。


常見樣式

大多數PHP檔案操作允許在訪問檔案路徑時使用各種url樣式,如data://、zlib://或php://。這些操作通常用於遠端檔案,攻擊者可以在其中控制檔案包含完整的檔案路徑。

遠端檔案包含漏洞利用:

include($_GET['file'])
include('php://filter/convert.base64-encode/resource=index.php');
include('data://text/plain;base64,cGhwaW5mbygpCg==');

Phar後設資料

但到目前為止,很少有人關注phar://這個點。Phar(PHP Archive)檔案的有趣之處在於它們包含序列化格式的 。讓我們建立一個Phar檔案,並新增一個包含一些資料作為後設資料的物件:


// 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();

我們新建的test.phar檔案有以下內容。我們可以看到物件被儲存為一個序列化的字串。

1.png


PHP物件注入

如果現在透過phar://對我們現有的Phar檔案執行檔案操作,則其序列化後設資料將被反序列化。這意味著我們在後設資料中注入的物件被載入到應用程式的範圍中。如果此應用程式具有已命名的AnyClass類並且具有魔術方法destruct()或wakeup()定義,則會自動呼叫這些方法。這意味著我們可以在程式碼庫中觸發任何解構函式或wakeup方法。更糟糕的是,如果這些方法對我們注入的資料進行操作,那麼這可能會導致進一步的漏洞。


class AnyClass {
    function __destruct() {
        echo $this->data;
    }
}
// output: rips
include('phar://test.phar');

利用

首先,攻擊者必須能夠在目標Web伺服器上植入一個Phar檔案。Sam Thomas發現了一個如何將Phar檔案隱藏到JPG檔案中的 ,因此只要常見的圖片上傳功能就足夠。但這並不重要,因為如果攻擊者可以在ìnclude(),fopen(),file_get_contents(),file()等操作中控制完整的檔案路徑,那麼將會造成嚴重的安全漏洞。因此,通常會在使用者輸入中驗證這些功能。但是現在攻擊者可以透過phar://注入並獲得程式碼執行。

到目前為止看起來無害的程式碼示例:

file_exists($_GET['file']);
md5_file($_GET['file']);
filemtime($_GET['file']);
filesize($_GET['file']);

總結

透過RIPS的分析,我們可以自動檢測使用者輸入是否在PHP檔案操作中未經驗證。

這樣,我們檢測是否存在檔案刪除、檔案洩露、檔案寫入,檔案操作,檔案建立、檔案包含(等等)漏洞。

檢測漏洞

此外,RIPS對敏感字串分析使我們能夠精確評估檔案路徑是完全還是由攻擊者控制,以及是否可以phar://注入。最後,我們在RIPS程式碼分析器中新增了一個名為Phar Deserialization的新漏洞型別,以檢測這種新型別的程式碼風險。


本文轉載自“ FreeBuf.COM ”,原文由 周大濤編譯

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31510736/viewspace-2213374/,如需轉載,請註明出處,否則將追究法律責任。

相關文章