WordPress Core SQL注入漏洞(CVE-2022–21661)分析
發布時間 2022-01-25漏洞概述
WordPress是目前全球流行的三大內容管理系統之一,其核心模塊(Core)出現漏洞的情況相對較少。近期,WordPress核心模塊被披露存在一處SQL注入漏洞(CVE-2022–21661)。針對該高危漏洞,啟明星辰ADLab研究員第一時間進行了詳細分析和驗證。
受影響版本
受影響版本:WordPress < 5.8.3
漏洞分析
通過比較github上的源代碼,可以發現漏洞的位置是clean_query函數。在5.8.2及之前的老版本中,該函數的關鍵代碼如下。
在clean_query函數中,當傳遞進來的$query滿足以下兩個條件:
$query['taxonomy']為空;
$query['filed']的值等于term_taxonomy_id。
WordPress的執行就會進入580行,調用transform_query函數。跟進該函數,滿足602行,不做任何措施直接return,保持了terms的值不受改變。
全局搜索clean_query,其被get_sql_for_clause函數調用。閱讀該方法的代碼可知,它的功能是為sql查詢中的條件創建子句。具體來說,它的工作是處理接收到的數據,將這些數據組合成SQL 查詢中的條件,然后將其返回給父函數。所以,如果可以控制clean_query的返回數據,就可以控制SQL查詢進行注入。
在get_sql_for_clause中可以找到$terms變量被拼接到sql語句中。
從get_sql_for_clause方法繼續回溯,調用棧如下:
在get_posts()中可以找到對WQ_Tax_Query->get_sql()的調用。
通過回溯調用??芍?,通過控制WP_Query->__construct()中的屬性,就可以造成sql注入。
漏洞復現
通過分析WordPress的源碼發現,WordPress核心代碼中不存在可以觸發該漏洞的調用點。為了驗證該漏洞,這里使用了Ele Custom Skin插件做漏洞復現,這也是ZDI給出的存在產生漏洞調用的插件樣例。
EleCustom Skin插件安裝量在10萬以上,且其存在的漏洞調用是無需登錄的。該插件存在方法get_document_data(),其核心代碼如下:
全局搜索get_document_data,該方法被注冊的action名字如下。
因此,該漏洞在這個插件是存在觸發路徑的。開啟debug功能后,構造報文即可成功注入出數據庫user。
流行插件分析
為了分析該漏洞的實際影響,ADLab研究員還對WordPress前100個流行插件進行了分析,發現其中2個插件也存在該漏洞。
開啟debug,構造報文即可成功注入出數據庫user。
修復方案
目前WordPress已發布升級補丁以修復漏洞,補丁獲取鏈接如下:
https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-6676-cqfm-gw84
參考鏈接:
https://www.zerodayinitiative.com/blog/2022/1/18/cve-2021-21661-exposing-database-info-via-wordpress-sql-injection