50
技術社區[雲棲]
Joomla 3.4.3版本 SQL注入漏洞分析
0x00 漏洞分析
漏洞觸發的代碼位於:/administrator/components/com_contenthistory/models/history.php,getListQuery()函數內:
通過SQL及報錯信息,可以知道我們的注入payload被插入到了紅色框部分內。跟進getState()函數,位於libraries/legacy/model/legacy.php文件內,代碼如下:
從函數參數和官方注釋,可以知道,getState()函數功能是獲取一個model的屬性及屬性對應的值,getState()函數在model的屬性未設置時,會執行$this->populateState()來對model的一些屬性進行賦值操作。
我們跟進populateState()函數看下做了什麼操作,代碼位於:/administrator/components/com_contenthistory/models/history.php 內:
該函數從用戶輸入中取出item_id,type_id,type_alias,等幾個變量,對當前model的屬性進行賦值,可控變量均強製為integer類型,無法利用。順著最後一行代碼:parent::populateState(‘h.save_date’, ‘DESC’),繼續跟到父類中看父類populateState()函數的定義,代碼位於:libraries/legacy/model/list.php,482行附近:
getUserStateFromRequest()函數用於將GET/POST中得list[]變量取回到$list中,並在第三個參數中指定該變量類型為array(),繼續跟進:
代碼對取到的list[]數組進行了遍曆,並做相應的過濾、拆分,可以看到list[select]沒有處理邏輯,會進入default的case,後續$this->setState(‘list.’ . $name, $value)代碼執行後,導致請求中list[select]變量沒有任何變量被直接賦值給Model屬性,繼續回頭看文章最開始的注入位置,此時我們可以控製$this->getState(‘list.select’)的返回值,構造SQL注入。
確認了輸入可控的位置,構造有效的payload,還需要解決幾個小問題。構造POC:
index.php?option=com_contenthistory&view=history&item_id=1&type_id=1&list[select]=(exp(~(select * from(select md5(1))x)))
會發現出現錯誤提示 Unknown column ‘Array’:
需要增加list[ordering]=將原SQL中的order by字段值清空。
最終可執行POC:
/index.php?option=com_contenthistory&view=history&item_id=1&list[ordering]=&type_id=1&list[select]=(exp(~(select * from(select md5(1))x)))
執行會返回:
此帶回顯POC成功執行需要一個前提條件,就是傳入的item_id 可以在Joomla_ucm_history表中查詢到,否則會返回“500 – Layout default not found.”的提示。根據原文描述,可以暴力猜解item_id或使用time_based payload,不再贅述。
0x01 漏洞影響
joomla3.2-3.4.4版本
0x02 修複方案
目前Joomla官方已經跟新3.4.5版本,用戶可登陸後台進行更新。
或下載官方升級包升級,下載地址:
https://github.com/joomla/joomla-cms/releases
0x03 參考鏈接
https://www.trustwave.com/Resources/SpiderLabs-Blog/Joomla-SQL-Injection-Vulnerability-Exploit-Results-in-Full-Administrative-Access/
作者:雲盾攻防對抗團隊 - 千霄
發表日期:2015年10月23日
最後更新:2017-04-01 13:51:26