看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

2019-06-03 65528人圍觀 ,發現 2 個不明物體 WEB安全

看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

近期,Drupal發布了兩個針對7.x和8.x版本的關鍵漏洞修復補丁。攻擊者可以利用這兩個漏洞來實現遠程代碼執行,但他們首先要將惡意圖片上傳至遠程服務器,并通過一系列偽造鏈接來欺騙已認證的網站管理員來幫助他們實現代碼執行。雖然這種方式比較“曲折”,但這也已經足夠了。

漏洞利用演示視頻

這兩個漏洞編號分別為ZDI-19-130和ZDI-19-291,將這兩個漏洞組合使用后,攻擊者將能夠實現一鍵式代碼執行。在賬戶注冊的過程中,攻擊者可以將嵌入了惡意代碼的圖片以頭像的形式上傳,也可以在論壇的評論區上傳。已禁用用戶注冊和用戶評論功能的Drupal網站不會受到這種攻擊的影響,請廣大網站管理員盡快將自己的Drupal站點升級為最新版本。

其中,ZDI-19-130是一個PHP反序列化漏洞,該漏洞將允許攻擊者利用網站管理員來實現遠程代碼執行,而ZDI-19-291是一個持久型XSS漏洞,攻擊者可以利用該漏洞強迫網站管理員發送惡意請求,并觸發漏洞ZDI-19-130。

關于ZDI-19-130的利用原理可以參考Thomas在今年Black Hat上的演講白皮書】,或參考Thomas在BSidesMCR上的 演講內容。簡而言之,這是一種通過Phar文件觸發PHP反序列化漏洞的一種新方法,PHP Phar文件的元數據會以PHP序列化對象的形式存儲,針對Phar文件的文件操作會觸發服務器在已存儲的元數據上執行反序列化-unserialization()操作,并最終導致遠程代碼執行。

漏洞ZDI-19-291則是Drupal在處理已上傳文件的文件名過程中存在的一個漏洞,該漏洞與PCRE-Perl兼容的正則表達式有關。當用戶上傳文件時,Drupal會使用PRCE來修改文件名,以避免文件名重復。但是如果多次上傳文件,Drupal就會刪除文件的擴展名,并導致攻擊者可以上傳任意HTML文件。

漏洞分析

攻擊第一階段:ZDI-19-291

這份PHP代碼段可以用來測試Drupal的部分源碼:【點我獲取】。

根據源碼的注釋,下面這段代碼會嘗試刪除文件名中值小于0×02的ASCII控制字符,并將其替換成下劃線(‘_‘)。代碼中的’/u’表示PHP引擎會將PCRE表達式以及相關字符串以UTF-8編碼進行處理:

看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

攻擊第一階段測試結果:

看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

其中,\xFF字節已經失效,\x80字節沒有有效的起始字節,PHP拋出了一個“PREG_BAD_UTF8_ERROR”錯誤,$basename變量被設置為了NULL。

在Drupal源碼中,執行完preg_replace()后不會進行錯誤檢查。當一個帶有無效UTF-8字符文件名的圖片上傳至Drupal兩次時,該函數將會使用$basename變量值來運行,并將其視作空字符串來處理。最后,函數會返回$destination,也就是’_’.$counter++的結果。

看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

這樣一來,攻擊者就可以通過用戶注冊功能向Drupal網站上傳一個GIF圖片,然后Drupal會用以下方式存儲圖片:

/sites/default/files/pictures/<YYYY-MM>/_0

而不是默認存儲方式:

/sites/default/files/pictures/<YYYY-MM>/profile_pic.gif

雖然應用會對上傳圖片的屬性進行檢測,但添加“GIF”或“.gif”字樣已經可以滿足檢測條件了。

另一種方法是通過評論編輯器上傳惡意GIF文件。這種情況下,圖片會被存儲至/sites/default/files/inline-images/_0。但是,攻擊者在評論某篇文章之前注冊一個用戶賬號。

攻擊者將惡意GIF/HTML文件上傳至Drupal服務器之后,可以欺騙瀏覽器將文件以HTML頁面的形式呈現出來:

看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

此時,攻擊者將可以在目標Drupal站點上實現持久化XSS攻擊了。通過利用這種漏洞,攻擊者將能夠強迫擁有管理員權限的用戶發送攻擊第二階段的惡意請求。

可執行PoC:【點我獲取

漏洞利用-第二階段:ZDI-19-130

ZDI-19-130是一個反序列化漏洞,可以通過/admin/config/media/file-system節點的file_temporary_path請求參數來觸發。攻擊者還可以指定“phar://”流封裝器來讓file_temporary_path請求參數指向攻擊者上傳至Drupal服務器的惡意Phar文檔。

下面的system_check_directory()函數是表單回調函數,負責處理用戶請求。根據我們的研究,“!is_dir($directory)”可以直接讓PHP觸發針對Phar文檔中元數據的反序列化操作。通過POP鏈利用技術,攻擊者將能夠使用專門制作的Phar文檔來在Web服務器中實現任意代碼執行。

看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

漏洞利用-第二階段:Polyglot文件

在利用ZDI-19-130之前,我們需要上傳一個Phar文檔,我們可以在用戶注冊階段將JPEG/Phar Polyglot文件以用戶頭像的形式上傳。下面給出的是一個JPEG/PharPolyglot文件樣本,它會執行cat /etc/passwd命令,并利用漏洞ZDI-19-130。

看我如何利用Drupal漏洞并通過惡意圖片實現一鍵RCE

Phar文檔跟JAR文件很像,它是一個組件包集合文件。在我們的漏洞利用場景中,使用的是基于TAR的Phar文檔。

為了創建Polyglot文件,攻擊者需要選擇一個JPEG圖片向量?;赥AR的惡意Phar文檔需要存儲在JPEG文件開頭的JPEG注釋域中。需要注意的是,我們需要修復TAR文件的校驗碼,否則TAR文件會崩潰。

* 參考來源:thezdi,FB小編Alpha_h4ck編譯,轉載請注明來自FreeBuf.COM

發表評論

已有 2 條評論

取消
Loading...

特別推薦

推薦關注

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php jizzz