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