漏洞概述
WordPress是目前全球流行的三大內容管理系統之一,其核心模組(Core)出現漏洞的情況相對較少。近期,WordPress核心模組被披露存在一處SQL隱碼攻擊漏洞(CVE-2022–21661)。針對該高危漏洞,啟明星辰ADLab研究員第一時間進行了詳細分析和驗證。
受影響版本
受影響的版本:WordPress < 5.8.3
漏洞概述
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方法繼續回溯,呼叫棧如下:
WP_Query->__construct()
WP_Query->query()
WP_Query->get_posts()
WQ_Tax_Query->get_sql()
WQ_Tax_Query->get_sql_clauses()
WQ_Tax_Query->get_sql_for_query()
WQ_Tax_Query->get_sql_for_clause()
WQ_Tax_Query->clean_query()
在get_posts()中可以找到對WQ_Tax_Query->get_sql()的呼叫。
透過回溯呼叫棧可知,透過控制WP_Query->__construct()中的屬性,就可以造成sql注入。
透過分析WordPress的原始碼發現,WordPress核心程式碼中不存在可以觸發該漏洞的呼叫點。為了驗證該漏洞,這裡使用了Ele Custom Skin外掛做漏洞復現,這也是ZDI給出的存在產生漏洞呼叫的外掛樣例。
Ele Custom Skin外掛安裝量在10萬以上,且其存在的漏洞呼叫是無需登入的。該外掛存在方法get_document_data(),其核心程式碼如下:
public function get_document_data(){
global $wp_query;
$id = $this->widget_id;
$post_id = $this->post_id;
$theme_id = $this->theme_id;
$old_query = $wp_query->query_vars;
$this->query['paged'] = $this->current_page; // we need current(next) page to be loaded
$this->query['post_status'] = 'publish';
$wp_query = new \WP_Query($this->query);
wp_reset_postdata();//this fixes some issues with some get_the_ID users.
if (is_archive()){
$post_id = $theme_id;
}
$document = \Elementor\Plugin::$instance->documents->get_doc_for_frontend( $post_id );
$theme_document = \Elementor\Plugin::$instance->documents->get_doc_for_frontend( $theme_id );
$data[] = $this->get_element_data($id,$theme_document->get_elements_data());
// Change the current post, so widgets can use `documents->get_current`.
\Elementor\Plugin::$instance->documents->switch_to_document( $document );
ob_start();
$document->print_elements_with_wrapper( $data );
$content = ob_get_clean();
echo $this->clean_response($content,$id);
\Elementor\Plugin::$instance->documents->restore_document();
$wp_query->query_vars = $query_vars;
die;
}
全域性搜尋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
啟明星辰積極防禦實驗室(ADLab)
ADLab成立於1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員,“黑雀攻擊”概念首推者。截止目前,ADLab已透過CVE累計釋出安全漏洞近1100個,透過 CNVD/CNNVD累計釋出安全漏洞2000餘個,持續保持國際網路安全領域一流水準。實驗室研究方向涵蓋作業系統與應用系統安全研究、移動智慧終端安全研究、物聯網智慧裝置安全研究、Web安全研究、工控系統安全研究、雲安全研究。研究成果應用於產品核心技術研究、國家重點科技專案攻關、專業安全服務等。