WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

ADLab發表於2022-03-04


漏洞概述

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

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

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

Ø  $query['taxonomy']為空

Ø  $query['filed']的值等於term_taxonomy_id。

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

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

全域性搜尋clean_query,其被get_sql_for_clause函式呼叫閱讀方法程式碼可知,它的功能是為sql查詢中的條件建立子句具體來說,它的工作是處理接收到的資料,將這些資料組合成 SQL 查詢中的條件,然後將其返回給父函式。所以,如果可以控制clean_query的返回資料,就可以控制SQL查詢進行注入。

在get_sql_for_clause中可以到$terms變數被拼接到sql語句中

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

從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()的呼叫

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

透過回溯呼叫棧可知透過控制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名字如下。

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

因此,該漏洞在這個外掛是存在觸發路徑的。開啟debug功能後,構造報文即可成功注入出資料庫user

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

流行外掛分析

為了分析該漏洞的實際影響,ADLab研究員還對WordPress前100個流行外掛進行了分析,發現其中2個外掛也存在該漏洞。

開啟debug,構造報文即可成功注入出資料庫user。

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析

WordPress Core SQL 注入漏洞(CVE-2022–21661)分析


修復方案

目前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安全研究、工控系統安全研究、雲安全研究。研究成果應用於產品核心技術研究、國家重點科技專案攻關、專業安全服務等






圖片



相關文章