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及之前的老版本中,該函數的關鍵代碼如下。


代碼如下.png


在clean_query函數中,當傳遞進來的$query滿足以下兩個條件:

$query['taxonomy']為空;

$query['filed']的值等于term_taxonomy_id。


WordPress的執行就會進入580行,調用transform_query函數。跟進該函數,滿足602行,不做任何措施直接return,保持了terms的值不受改變。


代碼如下.png


全局搜索clean_query,其被get_sql_for_clause函數調用。閱讀該方法的代碼可知,它的功能是為sql查詢中的條件創建子句。具體來說,它的工作是處理接收到的數據,將這些數據組合成SQL 查詢中的條件,然后將其返回給父函數。所以,如果可以控制clean_query的返回數據,就可以控制SQL查詢進行注入。


在get_sql_for_clause中可以找到$terms變量被拼接到sql語句中。


代碼如下.png


從get_sql_for_clause方法繼續回溯,調用棧如下:


代碼如下.png


在get_posts()中可以找到對WQ_Tax_Query->get_sql()的調用。


代碼如下.png


通過回溯調用??芍?,通過控制WP_Query->__construct()中的屬性,就可以造成sql注入。


漏洞復現


通過分析WordPress的源碼發現,WordPress核心代碼中不存在可以觸發該漏洞的調用點。為了驗證該漏洞,這里使用了Ele Custom Skin插件做漏洞復現,這也是ZDI給出的存在產生漏洞調用的插件樣例。


EleCustom Skin插件安裝量在10萬以上,且其存在的漏洞調用是無需登錄的。該插件存在方法get_document_data(),其核心代碼如下:


代碼如下.png

代碼如下.png 

全局搜索get_document_data,該方法被注冊的action名字如下。


代碼如下.png


因此,該漏洞在這個插件是存在觸發路徑的。開啟debug功能后,構造報文即可成功注入出數據庫user。


代碼如下.png


流行插件分析


為了分析該漏洞的實際影響,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