PHP的兩個特性導致waf繞過注入(有趣的知識點)

2021-07-14 10:07:51 字數 2640 閱讀 1186

1、hpp http引數汙染

http引數汙染指的是,在url中提交相同鍵值的兩個引數時,伺服器端一般會進行一些處理。比如apache就要以最後乙個引數為準,比如:

user.php?id=111&id=222

如果輸出$_get陣列,則id的值只會取222,即url上提交的多餘值覆蓋了前乙個值。

2、乙個ctf題目

關於注入的waf繞過,注入點為:

$sql="select * from user where id=".$_request["id"].";";
可以看到了request進行傳遞,並且存在如下的waf**:

functionwaf($str)   

functionwafarr($arr)

}

wafarr($_get);

wafarr($_post);

wafarr($_cookie);

wafarr($_session);

functionstripstr($str)

$uri= explode("?",$_server['request_uri']);

if(isset($uri[1]))

}}

functionstriparr($arr)

return$new_arr;

}

$_get=striparr($_get);

$_post=striparr($_post);

$_cookie=striparr($_cookie);

$_session=striparr($_session);

這裡使用了waf函式分別對get post session cookie資料進行過濾,並且對這些全域性陣列進行轉義。

值得注意的是,這裡的$_request是**中重新根據$_server['request_uri']進行拼接,在拼接過程中將引數值進行轉義操作。

(1)思路1  使用hpp特性

看似不太可能存在注入,但是使用hpp可以實現。

示例**:

user.php?id=0 or 1&id%00=1

user.php?id=0 or 1&%20id=1

user.php?id=0 or 1?&id=1

測試**:

<?php 

function striparr($arr)

return $new_arr;

}function stripstr($str)

$uri = explode("?",$_server['request_uri']);

if(isset($uri[1]))

}}var_dump($_get) ;

var_dump($_request) ;

?>

輸出結果:

可以看到,這裡的get陣列取到了最後乙個值,不會觸發waf,而request資料中,id則為我們的注入語句,這樣

利用這兩者之間的差異,我們可以繞過waf函式的檢測,並且利用之前的注入點來實現注入。

(2)思路2: 利用#特性($_server['request_uri'])

在瀏覽器中,是不會將#號之後的hash內容傳送給伺服器的,這裡利用burp發包,可以將hash的內容傳送至伺服器,比如傳送:

/#?id=1

這裡get陣列為空,request則輸出為/#?id=1,這樣,就可以繞過waf函式對get陣列的判斷,

並且在request(這裡主要因為request陣列是使用了request_uri進行了重組)中攜帶注入的語句,繞過了waf檢測。

3、總結

這種特性導致的漏洞場景比較特殊,首先,ctf中模擬的場景是waf函式只對get,post,session,cookies全域性陣列進行的處理,注入點為request,在場景中,**對request陣列通過$_server['request_uri'],使用&分割重新組裝的,這種**處理可能是由於程式設計師想對request陣列進行轉義或者一些淨化處理才加進來的。

利用:(1)hpp特性,提交重複引數內容,php處理引數時會覆蓋,但是程式拼接時會出現差異,

比如提交:http://

127.0.0.1/shell.php?id=0 or 1&id%00=1

get為id=1,request為:

'id' =>

string

'0%20or%201'

(length=10)

'id%00' =>

string

'1'(length=1)

可以看到,成功將注入內容引入到request陣列中。

(2)利用#符號,#後面的內容不會帶入至get陣列中,但是會出現在request_uri中,所以可以利用這個特性將注入語句帶入到request物件中。

總之,這種特性導致的漏洞場景比較特殊,但是確實比較有趣。

PHP的兩個特性導致waf繞過注入

1 hpp http引數汙染 http引數汙染指的是,在url中提交相同鍵值的兩個引數時,伺服器端一般會進行一些處理。比如apache就要以最後乙個引數為準,比如 user.php?id 111 id 222 如果輸出 get陣列,則id的值只會取222,即url上提交的多餘值覆蓋了前乙個值。2 乙...

學習hibernate不可繞過的兩個問題

剛剛學了hibernate,對以下兩個問題比較感興趣,僅僅代表個人的見解,大家多多指教。第乙個問題 為什麼在寫主配置檔案 時,用的載體是xml,而不是寫在了其他載體上?次要原因xml語句優美對稱,條理清晰,寫語句時會感受到它的潛在提示作用 個人觀點 如果不用xml這個載體,還有其它更好的載體嗎?至少...

小紅傘的WAF乙個繞過方法

今天遇到乙個小紅傘的waf,隨手測了下,發現很多都攔截了。但是任何waf都不是萬能的。對此,該waf我發現了乙個缺陷。例如在大小字元上沒有做什麼匹配策略。我可以很輕易的繞過去。雖然沒法構造能夠通過名單的select,但是其他的都繞過去了。把一些敏感的東西發出來,給有需要的人用。select 一開始這...