【漏洞復現】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析與復現


影響版本

wordpress < 5.8.3

分析

參考:https://blog.csdn.net/qq_46717339/article/details/122431779

在 5.8.3 版本中,wordpress 已經修復了這個錯誤,比較[提交更改][Link 1]可以在處理變量之前clean_query添加檢查的函數中看到。$query['field']``$query['terms']

函數clean_query是從 調用的get_sql_for_clause。閱讀該函數的代碼會發現,該函數的工作是為 SQL 查詢中的條件創建子句,具體來說,它的工作是處理接收到的數據,將這些數據組合成 SQL 查詢中的條件。將其返回給父函數。所以我們可以控制這個函數的返回數據,也就是說我們可以控制SQL查詢,進行SQL注入。

回到函數clean_query,當這個改動沒有做的時候,默認情況下$query['terms']只會刪除in的值,然后再調用到$this->transform_query( $query, 'term_taxonomy_id' );

為了避免下降if,它$query['taxonomy']需要為空或is_taxonomy_hierarchical返回false的值。

該函數transform_query將檢查$query['field'] == $resulting_field,如果為真,則返回並且不做進一步處理,因此如果變量$query['field']term_taxonomy_id,我們可以退出函數而不更改變量值$query['terms']

(這里的比較是使用==並且存在Loose比較的漏洞,在某些情況下這個錯誤可以用來隨意創建條件句)。

函數逃逸后,返回原位的代碼流會調用clean_query函數get_sql_for_clause,變量的值$query['terms']會直接作為SQL查詢條件,導致SQL注入。

利用鏈

WP_Query#__construct
    WP_Query#query
        WP_Query#get_posts
            WP_Tax_Query#get_sql
                WP_Tax_Query#get_sql_clauses
                    WP_Tax_Query#get_sql_for_query
                        WP_Tax_Query#get_sql_for_clause

主要參數$query只需要滿足以下2個條件,就可以觸發SQL注入漏洞:

  • $query['include_children']取值為false(或者is_taxonomy_hierarchical($query['taxonomy'])取值為false);
  • $query['field']取值為term_taxonomy_id

雖然這是wordpress核心的bug,但是wordpress核心的復用方式並不能觸發錯誤,在插件和主題中會自動轉向錯誤方向。WP_Query當你要查詢數據庫時,插件/主題會調用該類,從源代碼中識別錯誤的方法是在使用時WP_Query($data)和 $data 是可控的。

例如,new WP_Query(json_decode($_POST['query_vars']))有效載荷將采用以下形式:

query_vars={
     "tax_query":{
     "0":{
     "field":"term_taxonomy_id","terms":["<inject>"]}}} 

query_vars={ 
     "tax_query":{
     "0":{
     "taxonomy":"nav_menu","field":true,"terms":["<inject>"]}}}

環境搭建

0 本地下載wordpress 5.8.2

1 首先自己建一個數據庫,供wordpress使用。

注意 自己先建一下數據庫,wordpress無權建立數據庫,否則會安裝不成功。

2 phpstudy 把wordpress放進去就可以

3 訪問http://127.0.0.1/wordpress-5-8-2/wordpress/開始安裝,選擇自己剛才創建的數據庫即可。

4 搭建完成。登錄后台的記得要注銷退出,否則無法復現。

修改配置

為了看到報錯信息,可以將debug打開,如果不打開只能盲注,延時或者外帶

復現

檢查是否修復

首先看下wp-includes/class-wp-tax-query.php 559行是否變化,我下載的5.8.2 已經修補了,需要注釋掉。

然后瘋狂打斷點

打斷點

我在默認主題的位置新添加了一個函數,並加入到action

斷點如下,不會的照着打就可以了。

functions.php 640行開始
需要加下如下函數,默認主題沒有觸發點,其他主題應該有,想搞的懂了原理,可以自己去挖掘喲

function wp_query_test(){
    $c=stripslashes($_POST['data']);
    $d = json_decode($c, true);
    $wp=new WP_Query($d);
    wp_die();
}
add_action('wp_ajax_nopriv_test','wp_query_test',1);

wp-includes/class-wp-tax-query.php


打完開始請求

構造報錯請求

構造請求如圖所示

構造延時請求

報錯需要開啟debug,但是debug默認關閉,所以盲注

構造外帶請求

注意點

當登錄之后,這個點就不能利用了

默認只能盲注

默認wordpress不開啟debug所以不會報錯回顯,所以只能盲注,外帶

z2o安全攻防交流群

加入星球不定時分享最新漏洞復現POC滲透測試新工具內外網滲透測試騷操作

關注公眾號 公眾號不定時分享 最新漏洞復現POC內外網滲透測試騷操作。(~ ̄▽ ̄)~

加群不定時分享 最新漏洞復現POC內外網滲透測試騷操作。(~ ̄▽ ̄)~ , 加不進去的小伙伴可以公眾號回復 “加群”,添加Z2OBot 小K 自動拉入交流群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM