上個星期我被邀請組隊去參加一個由CSAW組織的CTF奪旗比賽.由於老婆孩子的緣故,我只能挑一個與Web漏洞利用相關的題目,名字叫作」HorceForce」.這道題價值300點。這道題大概的背景是,你擁有一個低權限的賬號並須要找到方法來得到管理員權限。 php
固然,有不少種方法來介紹如何經過這關,但我想分享下個人通關經驗。
html
當把一些單引號做爲參數值發送以後返回了MySQL的典型報錯信息「MySQL SQL Error Message」,所以能夠輕易發現這裏存在一個SQL注入漏洞。web
而後,正如你瞭解的,咱們一般會進行以下嘗試:
網絡
http://128.238.66.217/horse.php?id=7 or 1 IN (select current_user)
而後我獲得了一個錯誤信息,相似「請中止攻擊該網站「這樣的內容。框架
在我嘗試了不少繞過SQLi filter的方法以後,我意識到在網站背後配置了一個WAF來阻止任意包含「select」或「union」等在利用SQL注入時經常使用的SQL查詢關鍵字。經過這樣的黑盒測試能夠猜想出WAF使用了相似下面這樣的正則:
ide
/^.*select.*$/ or /^.*union.*$/
這意味着,提交任意帶有SQL注入企圖的字符串,如blablaSELECTblabla或像/*!union*/這樣的繞過方式都會觸發WAF攔截的錯誤信息。 測試
在進行了一些研究以後,我發現經過HTTP參數污染的方式可以使攻擊者繞過WAF的攔截。 網站
那麼,究竟要如何實現呢?spa
咱們假設有一個經過GET方式提交的參數「id」,你能夠重複構造這個參數並如下面的形式發送出去:
.net
?id=value1&id=value2
而後,依你使用的框架不一樣(PHP,Java,ASP.NET,etc),參數字符串會以不一樣的方式進行解析,在咱們實驗的場景下Apache/PHP,若是你能夠屢次注入同一個參數值,只有最後一個參數值會被框架解析,可是你猜怎麼着?只有第一個參數會通過WAF的分析和過濾!
這意味着,經過注入: id=7&id=[SQLi]
WAF的網絡層會解析 id=7 <-合法
PHP應用層會解析 id=[SQLi] <-注入語句成功執行
所以,這是一個典型的例子,你注入的東西在網絡層和應用層被區別對待了。
下面是一張表格,列舉了不一樣的框架當屢次接受同一個參數時的不一樣表現。像ASP.NET,若是它接受到兩個參數值,它會拼接兩個相同參數的值,所以你能夠將被過濾的關鍵詞拆分到兩個參數中進行攻擊從而繞過WAF,固然這個主題已經超過這篇文章討論的範圍了。
128.238.66.217/horse.php?id=0&id=7%20union%20select%201,2,3,current_user
你能注意到,全部的注入利用語句都寫到了第二個參數值的位置,這將不會被WAF解析。
我獲得了第一次正確的返回結果:
csaw_chal1@localhost
接下來就是常規的MySQL注入過程,這裏再也不贅述,這篇文章主要在於講解一種新的繞過WAF的方式,Thx
for reading!
轉: http://www.freebuf.com/articles/web/5908.html 謝!