這個議題呢,主要是教大家一個思路,而不是把現成準備好的程式碼放給大家。
可能在大家眼中WAF就是不要臉的代名詞。如果沒有他,我們的“世界”可能會更加美好。但是事與願違。沒有它,你讓各大網站怎麼活。但是呢,我是站在你們的這一邊的,所以,今天我們就來談談如何繞過WAF吧。之所以叫做“雜談”,是因為我在本次演講裡,會涉及到webkit、nginx&apache等。下面正式開始:)
工具/原料
WAF
webkit
瀏覽器
fiddler
burp
小明工具包
cookie工具
直視WAF
大小寫轉換法:
看字面就知道是什麼意思了,就是把大寫的小寫,小寫的大寫。比如:
SQL:sEleCt vERsIoN();
XSS:
出現原因:在waf裡,使用的正則不完善或者是沒有用大小寫轉換函式
干擾字元汙染法:
空字元、空格、TAB換行、註釋、特殊的函式等等都可以。比如下面的:
SQL:sEleCt+1-1+vERsIoN /*!*/ ();`yohehe
SQL2:select/*!*/`version`();
XSS:下面一節會仔細的介紹
出現原因:利用網站使用的語言函式特性來繞過waf的規則或者使用會無視的字元
字元編碼法:
就是對一些字元進行編碼,常見的SQL編碼有unicode、HEX、URL、ascll、base64等,XSS編碼有:HTML、URL、ASCLL、JS編碼、base64等等
SQL:load_file(0x633A2F77696E646F77732F6D792E696E69)
XSS:
出現原因:利用瀏覽器上的進位制轉換或者語言編碼規則來繞過waf
拼湊法:
如果過濾了某些字串,我們可以在他們兩邊加上“原有字串”的一部分。
SQL:selselectect verversionsion();
XSS:
出現原因:利用waf的不完整性,只驗證一次字串或者過濾的字串並不完整。
總結:
本節是告訴大家,waf總會有自己缺陷的,任何事物都不可能完美。
站在webkit角度來說繞過WAF
詞法解析器:
可能這時會有人問到,說繞過WAF,怎麼跑到webkit上去了。嗯,你沒有看錯,我也沒有瘋。之說以站在webkit角度來講繞過WAF,是因為各個程式碼的功能是由瀏覽器來解析的。那瀏覽器中誰又負責解析呢?那就是webkit, 既然要說到webkit,那就不得不提webkit下的解析器——詞法分析器,因為我們在繞過的時候,就是利用解析器中的詞法分析器來完成。
就比如一個簡單的繞過WAF的XSS程式碼:
<iframe> <!--Java和script是回車,al和ert是Tab換行符--></p> <p>他可以彈窗,可以為什麼他可以彈窗呢?這裡面有回車、換行符啊。想要理解,我們來看看webkit下的Source/javascriptcore/parser/lexer.cpp是怎麼宣告的吧。</p> <p>while (m_current != stringQuoteCharacter) {</p> <p>if (UNLIKELY(m_current == '\\')) {</p> <p>if (stringStart != currentSourcePtr() && shouldBuildStrings)</p> <p>append8(stringStart, currentSourcePtr() - stringStart);</p> <p>shift();</p> <p>LChar escape = singleEscape(m_current);</p> <p>// Most common escape sequences first</p> <p>if (escape) {</p> <p>if (shouldBuildStrings)</p> <p>record8(escape);</p> <p>shift();</p> <p>} else if (UNLIKELY(isLineTerminator(m_current)))</p> <p>shiftLineTerminator();</p> <p>注意倒數第二行裡的isLineTerminator函式。這裡我來說說大致的意思:所有的內容都在一個字串裡,用while逐字解析,遇到換行就跳過。然後在拼成一個沒有分割符的字串,所以這時的XSS程式碼成功彈窗了。</p> <p>Webkit裡的詞法分析器裡除了跳過換行符,還會跳過什麼字元呢?</p> <p>子曰:還有回車等分隔符。</p> <p>根據webkit詞法分析器的機制,我們就可以寫更多的猥瑣xss程式碼。</p> <p>分詞解析器注意事項:</p> <p><iframe src="java</p> <p>script:al ert(1)" height=0 width=0 /><iframe> <!--這個可以彈窗--></p> <p><iframe src=java</p> <p>script:al ert(1); height=0 width=0 /><iframe> <!--這個不可以彈窗--></p> <p>因為在webkit的詞法分析器裡,跳過回車、換行等分隔符時有個前提,那就是必須用單/雙引號圍住,不然不會跳過。因為如果不使用引號,詞法分析器會認為 回車、換行就是結束了,如果你執行上面這段程式碼,webkit會把java當做地址傳給src。詞法分析器跳過的前提就是建立在引號裡的,切記。</p> <p>分詞解析案例:</p> <p>回車、換行只在屬性中引號裡才會起作用。如果你對標籤或者屬性用 回車、換行,這時你大可放心,決對不會彈窗。而且在屬性值裡 回車、換行隨便用。如果空格出現在xss程式碼裡並不會彈窗,但是如果出現在字元和符號之前,就可以彈了。如圖:</p> <p>注意事項:</p> <p>跳過回車和換行,不支援on事件。例如下面的程式碼</p> <p><a href="java script:alert(1)">xss</a>會彈窗,但是下面的程式碼就不行了</p> <p><a href="#" onclick="aler t(1)">s</a>可見加了Tab換行,就無法彈窗了。但是還是支援字元和符號之間加入空格的。</p> <p>本節就是告訴大家,想要玩的更好,最好追溯到底層,從底層來看攻擊手法,你會發現很多問題迎刃而解。</p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/f/f5/ff5877fd9c34d6033758b1cc137c1dfd_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <h3> 利用Nginx&Apache環境 BUG來繞過waf<br> </h3> <p>這個bug比較雞肋,需要在nginx&apache環境,而且管理員較大意。</p> <p>這是一個不是bug的bug。</p> <p>當網站採用前端Nginx,後端Apache時,需要在conf配置,當遇到PHP字尾的時候,把請求交給Apache處理。但是Nginx判斷後綴是否為PHP的原理是根據URL的。也就是說如果當URL的字尾不是PHP的時候,他並不會把PHP教給Apache處理。</p> <p>配置:</p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/6/44/644d5fdc0bd536e9784fc3537c7041f4_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <p>乍一看,沒什麼問題。但是這裡隱藏一個漏洞。</p> <p>我在test目錄建立一個index.php:</p> <p>利用nginx&apache這個bug,再加上瀏覽器預設會隱藏index.php檔名,那麼漏洞就來了。</p> <p>訪問a.cn/test/index.php?text=<script>alert(1)</script>不會彈窗,被waf.conf給攔截了。</p> <p>訪問a.cn/test/?text=<script>alert(1)</script>會彈窗,沒有被waf.conf給攔截,因為nginx根據URL判斷這不是php檔案,並沒有交給apache處理,也就沒有走第三個location流程。</p> <p>本節是告訴大家,繞過WAF不用一直針對WAF,也可以利用環境/第三方的缺陷來繞過。</p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/f/10/f1085d9d23e9afdf6197e17997c1ce64_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/f/b3/fb31763cef9b13751015664a321842a3_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <h3> 從HTTP資料包開始說起<br> </h3> <p>現在有一部分網站waf是部署在客戶端上的,利用burp、fiddler就可以輕鬆繞過。</p> <p>很多時候我們遇到的情況就像這段程式碼一樣:</p> <p><input type="text" name="text"></p> <p><input type="submit" onclick="waf()"></p> <p>把waf規則放到js裡。我們可以提交一個woaini字串,然後用burp、fiddler抓包、改包、提交,輕輕鬆鬆的繞過了客服端的WAF機制。</p> <p>有的網站,他們對百度、google、soso、360等爬蟲請求並不過濾,這時我們就可以在USER-Agent偽造自己是搜尋引擎的爬蟲,就可以繞過waf</p> <p>有的網站使用的是$_REQUEST來接受get post cookie引數的,這時如果waf只對GET POST引數過濾了,那麼久可以在資料包裡對cookie進行構造攻擊程式碼,來實現繞過waf。</p> <p>有的waf對GET POST COOKIE都過濾了,還可以進行繞過。怎麼繞過呢?</p> <p>假設網站會顯示你的IP或者你使用的瀏覽器,那麼你就可以對IP、user-agent進行構造,在PHP裡X_FORWARDED_FOR和HTTP_CLIENT_IP兩個獲取IP的函式都可以被修改。</p> <h3> WAF讓你無視所有的VIP<br> </h3> <p>總結:</p> <p>很多人認為繞過WAF需要根據WAF的規則來繞過。但是我們可以忽視他,進行攻擊。我們利用第三方外掛來進行攻擊,因為第三方外掛的許可權非常大,而且他有一個特殊的性質,就是他可以跨域。</p> <p>我們可以事先在外掛裡呼叫一個js程式碼,對方安裝之後瀏覽任何網站都可以被XSS。</p> <p>我們現在來看段Maxthon外掛的原始碼:</p> <p>def.Json</p> <p>test.js:</p> <p>統一放在一個資料夾裡,再用Mxpacke.exe生成一個遨遊外掛。</p> <p>雙擊就可以安裝這個外掛。</p> <p>。這不算是一個漏洞,因為外掛必須要執行js程式碼,而XSS的宗旨就是 在網站裡執行你所指定的js程式碼。</p> <p>所以,這個xss沒辦法修復,而且chrome 火狐 等瀏覽器都存在。</p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/d/a4/da46868d90e0bb733bdefe51a643e1f0_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/5/9e/59e71b5ff24c7d9b1b5380582d3edd3c_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/7/7c/77ca3df991329189977ea86a2ce302da_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/9/53/95360fe7409578c6066f8ca0f815d500_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p> <p><a href="#" class="lightbox"><img src="http://img.wkgoto.com/upload/e/d5/ed53eced99395436f753ebcfecd8de4e_thumb.jpg" alt="雜談繞過WAFWeb應用防火牆" title="雜談繞過WAFWeb應用防火牆"></a><br></p><!-- lightBox --><!-- / lightBox -->