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