技術分享 | 一種針對PHP物件注入漏洞的新型利用方法

IT168GB發表於2018-08-31

頁首配圖

前言

就在前段時間的BlackHat駭客大會上,來自Secarma的安全研究專家Sam Thomas介紹了一種可導致嚴重PHP物件注入漏洞出現的新型漏洞利用技術,這種技術不需要使用到unserialize()這個PHP函式,雖然這是一種PHP反序列化漏洞,但它並不像大家所知道的那樣。在這種技術的幫助下,攻擊者將能夠提升相關漏洞的檔案嚴重性,並最終實現遠端程式碼執行。

不過大家不用擔心,RIPS已經將這種新型的攻擊型別增加到RIPS程式碼分析引擎之中了,感興趣的同學可以點選【 】檢視RIPS程式碼分析Demo。

流封裝器

在訪問一條檔案路徑時,大多數PHP檔案操作都允許使用各種URL風格的封裝器,例如data://、zlib://或php://。其中的某些封裝器通常都會被攻擊者用來利用某些潛在的遠端檔案包含漏洞,一旦利用成功,攻擊者將能夠控制目標檔案的完整檔案路徑。比如說,封裝器可以注入某些資源路徑,或注入需要直接執行的惡意PHP程式碼:


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

Phar後設資料

但是目前為止,還沒有人關注過phar://封裝器。之所以我們注意到了Phar檔案(一種PHP文件),是因為這種檔案所包含的後設資料採用的是一種序列化格式。接下來,我們一起建立一個Phar檔案,並向其中新增一個包含資料的物件來作為後設資料:


//create new Phar
$phar= new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt','text');
$phar->setStub('<?php__HALT_COMPILER(); ? >'); 
//add object of any class as meta data
classAnyClass {}
$object= new AnyClass;
$object->data= 'rips';
$phar->setMetadata($object);
$phar->stopBuffering();

我們新建立的這個test.phar檔案現在擁有如下所示的內容,我們可以看見我們新新增的物件會以序列化字串的形式進行儲存:

以序列化字串的形式進行儲存

PHP物件注入

如果一個檔案操作是透過phar://封裝器來對我們的Phar檔案進行的話,檔案所包含的序列化後設資料將會被反序列化。這也就意味著,我們在後設資料中注入的物件將會被載入到應用程式上下文中,如果目標應用程式有一個名叫AnyClass的類,並且定義了類似__destruct()或__wakeup()這樣的方法,那麼這些方法將會自動被呼叫。因此,我們將能夠觸發程式碼中任意的銷燬方法或喚醒方法。更嚴重的是,如果這些方法能夠直接對我們注入的資料物件進行操作的話,將導致更嚴重的漏洞出現。


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

漏洞利用

首先,攻擊者必須要製作一個Phar檔案,並將其儲存在目標Web伺服器中。但是Sam Thomas發現原來可以將Phar檔案隱藏在一個JPG檔案之中,所以這一步可以直接利用常見的圖片上傳功能來實現。

目前來說,還不足以造成嚴重的影響,因為如果攻擊者可以在類似include()、fopen()、file_get_contents()和file()這樣的操作中控制完整的檔案路徑,那麼這已經暴露了一個嚴重的安全漏洞了。因此,這些函式在處理使用者輸入資料時肯定會進行各種驗證。

不過,phar://封裝器在進行任意檔案操作時都會觸發反序列化行為,因此類似file_exists()這樣的檔案操作雖然只會檢查檔案是否存在,這樣的實現不僅沒有考慮安全風險之類的問題,而且也沒有采取任何的保護措施。因此,攻擊者將能夠注入phar://封裝器並獲取到程式碼執行許可權。

下面給出的是目前看似無害的程式碼段:


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

RIPS的自動檢測機制

在RIPS的幫助下,我們將能夠對未經過濾或驗證的使用者輸入資料(針對PHP檔案的操作)進行自動化檢測。這樣一來,我們就可以檢測檔案刪除、檔案披露、檔案寫入、檔案篡改、檔案建立和檔案包含漏洞。

RIPS的自動檢測機制

除此之外,RIPS的上下文敏感字串分析功能也可以幫助我們精準判斷檔案路徑是否可以被攻擊者部分或完全控制,以及是否可以注入phar://封裝器。更加重要的是,RIPS甚至還可以檢測到潛在的物件注入漏洞利用鏈。

RIPS的研究人員已將這種型別的PHP物件注入攻擊標記為了Phar Deserialization,RIPS程式碼分析器目前已支援檢測這種型別的程式碼風險。

本文轉載自“ FreeBuf.COM ”,原文由 FB小編Alpha_h4ck編譯

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

相關文章