繞過waf的話,一般我的思路是硬懟,或者迂回打擊。先說說兩種思路。
一 硬懟
硬懟的話,主要是從下面這些方法入手去操作。
(1)fuzz后綴名
看看有無漏網之魚(針對開發自定義的過濾可能有機會,針對waf基本不可能。更多的情況是php的站尋找文件包含或者解析漏洞乃至傳配置文件一類的,但是對于這種也大可不必fuzz后綴名了)
(2)http頭變量改造
首先要明確waf的檢測特征,一般是基于某種特定的情況下,去針對相應的攔截。幾個例子,文件上傳的時候,大多數Content-Type都是application/multipart-formdata這種,name對于waf來說,如果針對這種規則,對xxe ,sql注入,上傳,命令執行,內容等所有都去做一波掃描是及其浪費內存的,所以有可能針對不同的類型,做了不同的校驗規則。此時通過對Content-Type進行修改,可能會繞過waf。其他的http頭添加刪除等也是類似。
(3)文件后綴構造
這個和第一個有相似的就是都針對后綴名進行改造,不同的在于這里可能會利用waf的截取特征,比如回車換行繞過waf的檢測,但是對于后端來說接收了所有的傳入數據,導致了繞過waf。
(4)其他方法
這種就比較雜了,但是又不屬于迂回打擊的一類,比如重寫等方法。接下來就實戰來試試
第一步,先來對waf的規則做一個簡單的判斷。這里我的習慣是從內容,后綴兩個方向進行判斷。簡單來說,基本分為這幾種情況
(1)只判斷后綴(基本碰到的比較少了,因為很多時候白名單開發都可以完成)
(2)只判斷內容(也比較少,因為一般的waf都會帶后綴的判斷)
(3)內容后綴同時判斷(這種情況比較多,相對于來說會安全一點)
(4)根據文件后綴來判斷內容是否需要檢測(較多)
(5)根據Content-Type來判斷文件內容是否需要檢測
暫時只想到這么多,以后碰到了再單獨記吧。
有了思路,那么接下來就好說了。舉個例子我這里的情況
(1)傳腳本后綴(被攔截,判斷了后綴)
(2)傳腳本后綴加不免殺代碼(被攔截,可能后綴內容同時攔截)
(3)傳非腳本名(可自己fuzz一個能過waf的任意后綴,里面加惡意內容,被攔截。也就是說同時會對內容和后綴進行判斷)
說說我這里的情況,會對內容和后綴進行攔截。檢測到上傳jsp文件,任意內容都會被攔截。
先來fuzz一波能利用的后綴名,這里可以包括中間件的一些配置文件。希望不大,一點都不出意外,全部被攔截了。
既然我們需要對后綴名進行改造,就對后綴名后面加特殊符號做一個fuzz試試,測試了一下,在沒有惡意內容的情況下,只有'被過濾了。所以如果有機會,我們看看能不能試試系統特殊,比如;去做截斷。先記下來。因為最終還是需要免殺馬的,jsp免殺又不會,先不考慮這個,先考慮把waf繞過。(這里我對filename做了換行,然后去掉了引號,加了一個;做截斷繞過了waf,但是內容被查殺了,尷尬。)
接下來對http頭部進行改造一下嘗試繞過
一.filename改造
(2) 名字特殊符號替換以及構造異常閉合(符號方法很多自己天馬星空,我這里就寫幾個就行了,但是要注意你改造了得讓后端識別到,亂改造識別不到等于白搭)
filename='shell.jspx.jsp'
filename=shell.jspx.jsp
filename=shell.jspx.jsp'
"filename"=shell.jspx;
(3)重寫
filename=shell.jpg;filename=shell.jspx;
filename=shell.jspx;filename=shell.jpg;
(4)大小寫變化
FileName=shell.jspx.jsp'
(5)參數污染
FileName=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaashell.jspx.jsp'
FileName =shell.jspx(加空格)
filename===="shell.jspx.jsp1"(加等號)
FileName =shell.jspx(前后加空格,中間也可以加特殊符號fuzz)
(6)文件名字編碼(filename一般為后端接收參數,編碼了可能識別不到,這個就看情況)
filename=\u0073\u0068\u0065\u006c\u006c\u002e\u006a\u0073\u0070
(7)回車換行(有時候確實挺好用的,任意位置都可以試一下)
1.FileName=shell.jspx.
jsp
2.File
Name=shell.jspx.jsp'
二 name改造
name也可以任意改造,改造的方法和filename差不多,就不重復發了,主要是思路重要。
其他的比如奇奇怪怪的正則需要用到的特殊字符都可以在文件名中fuzz一下,看看能否打斷waf規則,也就是把我們fuzz后綴的再跑一次,或者再找點其他的正則字母,這里就不重復寫了。
http頭部格式上傳相關繞過
有一些用畸形相關的,不太推薦一來就試,fuzz的可以帶一下,這種屬于天時地利人和占據才用,畢竟底層的規定好的合規變了就不能識別,但是也說不準fuzz出問題了呢。fuzz本來就是一個天馬行空的過程,好了,繼續來看。
(1)Content-Disposition
溢出繞過
Content-Disposition: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa form-data; name="file"; filename=shell.jpg;filename=shell.jspx;
回車換行繞過(注意不要把固定字段打散了,)
Content-Disposition:
form-data; name="file"; filename=shell.jpg;filename=shell.jspx;
雙寫繞過(寫兩次)
Content-Disposition: form-data; name="file"; filename=shell.jpg;filename=shell.jspx;
Content-Disposition: form-data; name="file"; filename=shell.jpg;filename=shell.jspx.jpg;
還有一些參數污染加減空格啥的,和上面filename類似,就不重復寫了。
(2)boundary
加減空格或者前面加惡意的參數
boundary =---------------------------8472011224916008542288311250
&boundary =---------------------------8472011224916008542288311250
123& boundary =---------------------------8472011224916008542288311250
多個污染(他是用來分割的,他變了下面的也要變一下)
boundary =---------------------------8472011224916008542288311251
boundary =---------------------------8472011224916008542288311252
回車換行污染
分割污染(簡單來說就是他自定義了一些分割部分,我們可以把我們的惡意參數提交到其他的分割部分)見下圖第一個,視情況而定。其他的常用方式和上面都可以重復的
(3)Content-Type
直接刪除
修改類型為application/text或者 image/jpeg等等
回車換行
溢出
參數污染
重復傳入Content-Type
大小寫變換
設置charset
Content-Type: multipart/form-data;charset=iso-8859-13
列舉幾個
ibm869
ibm870
ibm871
ibm918
iso-2022-cn
iso-2022-jp
iso-2022-jp-2
iso-2022-kr
iso-8859-1
iso-8859-13
iso-8859-15
還有其他的方式,其實和上面的思路差不多
http頭部其他繞過
這一塊就比較多了,編碼,長度等等,都可以試一下,具體的方法和上面的差不多。這里就用參考鏈接pureqh老哥的幾個東西了。
1.Accept-Encoding 改變編碼類型
Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *
下面截取的圖片是我本次的,就不弄其他的了,長度那一塊,主要是說內容方面相關的。
2.修改請求方式繞過
post改為get put等其他的請求方式(這一塊主要是針對waf的攔截特性)
3.host頭部繞過
對host進行回車,換行
修改host頭部
host跟鏈接
host改為127.0.0.1
刪除host
到這里就差不多了,再來回頭理一下我們的思路。借用露迅先生的一句話,你如果啥都不曉得就莽起整,一些都等求于零。所以我們總結一下我們的思路。
waf的特性大多數是寫了很多的規則,基于截取的內容做規則匹配,匹配到了就不放行,未匹配到就認為是安全的放行,所以我們需要做的就是繞過waf對于規則的匹配。大概是這幾個方向
(1)基于正則匹配的繞過(也就是參數污染,正則破壞等上面的方法,打亂waf的檢測)
(2)基于正則匹配的缺失(類似于修改請求等,讓waf根本不去檢測這部分的內容)
(3)基于操作系統的特性(類似于后綴名加特殊符號讓操作系統進行識別)
我們做一切的前提都是既繞過了waf,也能讓后端識別,所以可以亂來,不要太亂。基本也就是污染,多寫,繞過,添加刪除幾個方向。
二 迂回打擊
說是迂回打擊,但是其實就是利用一些通用的手段,或者中間件的特性去繞過waf,甚至說尋找到了真實ip去直接繞過云waf等方法。這里我就簡單總結一些,不全面的話忘體諒。這一塊主要是內容相關的了。
基于http的繞過
這種屬于硬懟,方法如下:
1.免殺馬
這種是萬能的,只要能免殺就能如履平地,但是現在的waf規則更新太快了,熬了一夜去弄了個免殺,第二天踩了蜜罐上去就被抓,藍方產品支持加入規則,一點也不美滋滋,但是這也是一條YYDS的道路
2.分塊傳輸
說實話這玩意兒我從來沒有成功過,但是面試問的挺多的,有一次有個面試官還專門跟我提了這個所以我這里列舉一下。但是分塊參數+參數污染組合利用貌似效果還是不錯
3.修改長度字段
和分塊參數有點類似,作用是這樣,有些時候做參數大數據污染的時候,waf判斷數據過長直接丟棄,有些判斷長度和內容相差太多也直接丟棄。這時候可以把兩者結合起來使用,達到超長數據繞過waf的檢測,同時數據送到了后端
4.修改傳輸編碼
和分塊傳輸類似,自己手動去改,burp那個插件工具我是一次都沒成功過
5.基于網站系統特性添加字段
比如ASP專屬bypass-devcap-charset,添加這些字段去繞過waf的檢測(這也是我看到但是沒機會實戰,記錄一下)
6.修改頭部+內容結合
修改頭部為其他格式,再把內容頭加其他格式,例如圖片,中間插入惡意代碼,類似圖片馬
7.增加多個boundary
這樣子打亂了惡意內容,有點類似分開傳輸,欺騙waf的檢測,逃逸后面的代碼。
8.文件名寫入文件
windows下利用多個<<<<去寫入文件,詳情可以看參考鏈接。
還有一些其他的方法,這一種也是類似于對waf欺騙,過著直接利用免殺硬過waf的。jsp免殺不會,就不獻丑免殺了。
其他繞過
這種繞過就是一般適用于云waf了。咋說呢,這種我碰到的不怎么多,因為一般碰到的云waf基本都很強,注入上傳類的繞過現在越來越難了,xss還好一點,但是不走釣魚的話xss也沒用太大的用處,畢竟可以一把梭最舒服。來看看吧,檢測全球ping就行。
1.尋找真實ip
這個方法網上太多了,說下我常用的
(1)利用ssl證書尋找
(2)利用子域名尋找
(3)利用公司其他業務尋找(跑C端看運氣,和子域名一樣)
(4)利用信息泄露尋找(github,google,目錄文件,js代碼等)
(5)利用一些云網站或者專門查找cdn的網站,鏈接在家里電腦上,這電腦沒有,就自己去找吧
(6)利用已知工具
(7)搜索引擎(fofa,夸克等,看以前收集的業務)
(8)利用http返回信息
(9)找郵箱弱口令,然后你懂的
(10)找朋友,你懂的。
2.利用子域名去打
有些網站,可能外面做了防護,子域名沒加waf,而子域名又在白名單,迂回去錘就行了。
3.利用頭部繞過
基本碰不到了,修改host為本地ip,現在已經絕跡了,突然想起來寫一下。
4.找設備
找一些vpn一類的設備碰碰運氣
其他的就不說了吧,頭痛。總結下這個思路
(1)直接尋找waf保護后的目標地址,進行親身擁抱(繞過waf去打)
(2)尋找waf后目標的子女子孫親兒子(被waf加白的一些資產)去挑撥離間。
該文章在 2023/12/13 18:54:41 編輯過