影響版本
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 自動拉入交流群