一:大小寫轉換法:
看字面就知道是什么意思了,就是把大寫的小寫,小寫的大寫。比如:
SQL:sEleCt vERsIoN(); XSS:<sCrIpt>alert(1)</script>
出現原因:在waf里,使用的正則不完善或者是沒有用大小寫轉換函數
二:干擾字符污染法:
空字符、空格、TAB換行、注釋、特殊的函數等等都可以。比如下面的:
SQL:sEleCt+1-1+vERsIoN /*!*/ ();`yohehe
SQL2:select/*!*/`version`();
XSS:下面一節會仔細的介紹
出現原因:利用網站使用的語言函數特性來繞過waf的規則或者使用會無視的字符
三:字符編碼法:
就是對一些字符進行編碼,常見的SQL編碼有unicode、HEX、URL、ascll、base64等,XSS編碼有:HTML、URL、ASCII、JS編碼、base64等等
SQL:load_file(0x633A2F77696E646F77732F6D792E696E69) XSS:<script%20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript>
出現原因:利用瀏覽器上的進制轉換或者語言編碼規則來繞過waf
四:拼湊法:
如果過濾了某些字符串,我們可以在他們兩邊加上“原有字符串”的一部分。
SQL:selselectect verversionsion(); XSS:<scr<script>rip>alalertert</scr</script>rip>
出現原因:利用waf的不完整性,只驗證一次字符串或者過濾的字符串並不完整。
本節是告訴大家,waf總會有自己缺陷的,任何事物都不可能完美。
0×03站在webkit角度來說繞過WAF:
可能這時會有人問到,說繞過WAF,怎么跑到webkit上去了。嗯,你沒有看錯,我也沒有瘋。之說以站在webkit角度來講繞過WAF,是因為各個代碼的功能是由瀏覽器來解析的。那瀏覽器中誰又負責解析呢?那就是webkit, 既然要說到webkit,那就不得不提webkit下的解析器——詞法分析器,因為我們在繞過的時候,就是利用解析器中的詞法分析器來完成。
就比如一個簡單的繞過WAF的XSS代碼:
<iframe src="java script:alert(1)" height=0 width=0 /><iframe> <!--Java和script是回車,al和ert是Tab換行符-->
他可以彈窗,可以為什么他可以彈窗呢?這里面有回車、換行符啊。想要理解,我們來看看webkit下的Source/javascriptcore/parser/lexer.cpp是怎么聲明的吧。
while (m_current != stringQuoteCharacter) { if (UNLIKELY(m_current =='\\')) { if (stringStart != currentSourcePtr() && shouldBuildStrings) append8(stringStart, currentSourcePtr() - stringStart); shift(); LChar escape = singleEscape(m_current); if (escape) { if (shouldBuildStrings) record8(escape); shift(); } } else if (UNLIKELY(isLineTerminator(m_current))) shiftLineTerminator();
注意倒數第二行里的isLineTerminator函數。這里我來說說大致的意思:所有的內容都在一個字符串里,用while逐字解析,遇到換行就跳過。然后在拼成一個沒有分割符的字符串,所以這時的XSS代碼成功彈窗了。
Webkit里的詞法分析器里除了跳過換行符,還會跳過什么字符呢?
子曰:還有回車等分隔符。
根據webkit詞法分析器的機制,我們就可以寫更多的猥瑣xss代碼。
下面再說說這個注意事項:
<iframe src="java script:alert(1)" height=0 width=0 /><iframe> <!--這個可以彈窗--> <iframe src=java script:alert(1); height=0 width=0 /><iframe> <!--這個不可以彈窗-->
因為在webkit的詞法分析器里,跳過回車、換行等分隔符時有個前提,那就是必須用單/雙引號圍住,不然不會跳過。因為如果不使用引號,詞法分析器會認為 回車、換行就是結束了,如果你運行上面這段代碼,webkit會把java當做地址傳給src。詞法分析器跳過的前提就是建立在引號里的,切記。
這里在說一個:
回車、換行只在屬性中引號里才會起作用。如果你對標簽或者屬性用 回車、換行,這時你大可放心,決對不會彈窗。而且在屬
性值里 回車、換行隨便用。如果空格出現在xss代碼里並不會彈窗,但是如果出現在字符和符號之前,就可以彈了。如圖:
注意事項:
跳過回車和換行,不支持on事件。例如下面的代碼
<a href="javascript:alert(1)">xss</a>會彈窗,但是下面的代碼就不行了 <a href="#" onclick="alert(1)">s</a>可見加了Tab換行,就無法彈窗了。但是還是支持字符和符號之間加入空格的。
本節就是告訴大家,想要玩的更好,最好追溯到底層,從底層來看攻擊手法,你會發現很多問題迎刃而解。
0×04 利用Nginx&Apache環境 BUG來繞過waf:
這個bug比較雞肋,需要在nginx&apache環境,而且管理員較大意。
這是一個不是bug的bug。
當網站采用前端Nginx,后端Apache時,需要在conf配置,當遇到PHP后綴的時候,把請求交給Apache處理。但是Nginx判斷后綴是否為PHP的原理是根據URL的。也就是說如果當URL的后綴不是PHP的時候,他並不會把PHP教給Apache處理。
配置:
乍一看,沒什么問題。但是這里隱藏一個漏洞。
我在test目錄建立一個index.php:
利用nginx&apache這個bug,再加上瀏覽器默認會隱藏index.php文件名,那么漏洞就來了。
訪問a.cn/test/index.php?text=<script>alert(1)</script>不會彈窗,被waf.conf給攔截了。
訪問a.cn/test/?text=<script>alert(1)</script>會彈窗,沒有被waf.conf給攔截,因為nginx根據URL判斷這不是php文件,並沒有交給apache處理,也就沒有走第三個location流程。
本節是告訴大家,繞過WAF不用一直針對WAF,也可以利用環境/第三方的缺陷來繞過。
0×05 從HTTP數據包開始說起:
一:現在有一部分網站waf是部署在客戶端上的,利用burp、fiddler就可以輕松繞過。
很多時候我們遇到的情況就像這段代碼一樣:
<input type="text" name="text"> <input type="submit" onclick="waf()">
把waf規則放到js里。我們可以提交一個woaini字符串,然后用burp、fiddler抓包、改包、提交,輕輕松松的繞過了客服端的WAF機制。
二:有的網站,他們對百度、google、soso、360等爬蟲請求並不過濾,這時我們就可以在USER-Agent偽造自己是搜索引擎的爬蟲,就可以繞過waf
三:有的網站使用的是$_REQUEST來接受get post cookie參數的,這時如果waf只對GET POST參數過濾了,那么久可以在數據包里對cookie進行構造攻擊代碼,來實現繞過waf。
四:有的waf對GET POST COOKIE都過濾了,還可以進行繞過。怎么繞過呢?
假設網站會顯示你的IP或者你使用的瀏覽器,那么你就可以對IP、user-agent進行構造,在PHP里X_FORWARDED_FOR和HTTP_CLIENT_IP兩個獲取IP的函數都可以被修改。
想詳細了解的可以去:http://www.freebuf.com/articles/web/42727.html 0×06節。
本節告訴我們waf是死的,人是活的,思想放開。不要跟着WAF的思路走,走出自己的思路,才是最正確的。
0×06 WAF你算個屌:
很多人認為繞過WAF需要根據WAF的規則來繞過。但是我們可以忽視他,進行攻擊。
我們利用第三方插件來進行攻擊,因為第三方插件的權限非常大,而且他有一個特殊的性質,就是他可以跨域。
我們可以事先在插件里調用一個js代碼,對方安裝之后瀏覽任何網站都可以被XSS。
我們現在來看段Maxthon插件的源碼:
def.Json:
test.js:
統一放在一個文件夾里,再用Mxpacke.exe生成一個遨游插件。
雙擊就可以安裝這個插件。
這不算是一個漏洞,因為插件必須要運行js代碼,而XSS的宗旨就是 在網站里運行你所指定的js代碼。所以,這個xss沒辦法修復,而且chrome 火狐 等瀏覽器都存在。