Joomla!3.7.0組件SQL注入漏洞

Joomla! SQL 編程語言 PHP 安全客 2017-05-21

Joomla!3.7.0組件SQL注入漏洞

0x00 背景介紹


Joomla!是一套全球知名的內容管理系統。Joomla!是使用PHP語言加上MySQL數據庫所開發的軟件系統,可以在Linux、 Windows、MacOSX等各種不同的平臺上執行。目前是由Open Source Matters(見擴展閱讀)這個開放源碼組織進行開發與支持,這個組織的成員來自全世界各地,小組成員約有150人,包含了開發者、設計者、系統管理者、文件撰寫者,以及超過2萬名的參與會員。

0x01 漏洞簡介


漏洞名稱:Joomla!3.7.0 Core com_fields組件SQL注入漏洞

漏洞分類:SQL注入漏洞

漏洞等級:危急

利用方式:遠程

利用難度:簡單

漏洞描述:本漏洞出現在3.7.0新引入的一個組件“com_fields”,這個組件任何人都可以訪問,無需登陸驗證。由於對請求數據過濾不嚴導致sql注入,sql注入對導致數據庫中的敏感信息洩漏。

漏洞危害:被SQL注入後可能導致以下後果:1.網頁被篡改;2.數據被篡改;3.核心數據被竊取;4.數據庫所在服務器被攻擊變成傀儡主機

0x02 漏洞流程圖


如果不想看下一部分的複雜分析,你只需要記住這個最簡要的流程即可

Joomla!3.7.0組件SQL注入漏洞

0x03 漏洞分析


從數據流層面分析下這個漏洞,網上流傳的POC如下: /index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x3e,user()),0) 只從POC上可以看出list[fullordering]這個參數的值是經典的MYSQL報錯語句,成功爆出了數據庫用戶信息,效果如圖1所示:

Joomla!3.7.0組件SQL注入漏洞

圖1

下面動態調試跟蹤下本漏洞的成因,在這之前先講下整個數據流的流程:

1. 入口點是C:\phpStudy32\WWW\Joomla_3.7.0-Stable-Full_Package\components\com_fields\controller.php,

public function __construct($config = array()) 方法獲取傳入的view、layout的值進行邏輯判斷,給base_path賦值,如圖2

Joomla!3.7.0組件SQL注入漏洞

圖2

parent::__construct($config); 這個構造方法將圖3中幾個參數進行賦值,賦值之後

的效果如圖4所示:

Joomla!3.7.0組件SQL注入漏洞

圖3

Joomla!3.7.0組件SQL注入漏洞

圖4

這個漏洞最核心的地方是list[fullordering]這個參數如何進行數據傳遞的!!!libraries/legacy/model/list.php這個文件中getUserStateFromRequest方法,它將url中的list[fullordering]值提取進行保存,如圖5。

Joomla!3.7.0組件SQL注入漏洞

圖5

經過對於fullordering值得簡單判斷,並沒有做值的白名單校驗,程序即將進入第一部分的關鍵也就是通過566行的$this->setState('list.' . $name, $value);方法保存我們的SQL注入報錯代碼進入list.fullordering保存的前後過程如圖6,7所示。

Joomla!3.7.0組件SQL注入漏洞

圖6

Joomla!3.7.0組件SQL注入漏洞

圖7

1. 第一部分將我們的payload存進list.fullordering中,那麼如何獲取呢?直接進入最關鍵的部分./administrator/components/com_fields/models/fields.php文件中$listOrdering = $this->getState('list.fullordering', 'a.ordering');getState方法獲取了之前保存的list.fullordering的值,如圖8,並進行SQL語句的拼接,escape方法並沒有把我們的payload過濾掉。

Joomla!3.7.0組件SQL注入漏洞

圖8

3.最後一步,執行SQL語句,拼接的語句完整語句如圖9所示,在圖9中也能看到報錯的信息已經洩露,我們的payload已經成功執行了。

Joomla!3.7.0組件SQL注入漏洞

圖9

最終報錯的信息輸出到返回頁面中,如圖10所示。

Joomla!3.7.0組件SQL注入漏洞

圖10

完成的漏洞利用流程就走完了,下面對於這個漏洞的補丁進行分析。

0x04 補丁分析


Joomla!3.7.0組件SQL注入漏洞

最版本中不獲取用戶可控的list.fullordering值了,改為獲取list.ordering的值,那麼這個POC改為:/index.php?option=com_fields&view=fields&layout=modal&list[ordering]=updatexml(1,concat(0x3e,user()),0)

行不行呢?如下圖進行的嘗試,執行攻擊失敗。

Joomla!3.7.0組件SQL注入漏洞

原因是在存list[ordering]狀態的時候,ordering的檢測邏輯是對於值進行了白名單的確認,如果值不在filter_fields數組中,那麼list.ordering會被賦值為a.ordering,而不是之前我們的payload,如下圖所示。

Joomla!3.7.0組件SQL注入漏洞

0x05 總結


這個漏洞是由於list[fullordering]參數用戶可控,後端代碼並沒有進行有效過濾導致SQL語句拼接形成order by的注入,修復方案是執行語句獲取list.ordering值進行了白名單過濾,在存儲狀態的時候就將攻擊代碼覆蓋了,那麼在執行語句之前取的值自然就不包含攻擊代碼了。

0x06 參考


https://blog.sucuri.net/2017/05/sql-injection-vulnerability-joomla-3-7.html

https://github.com/joomla/joomla-cms

相關推薦

推薦中...