實(shí)驗(yàn)環(huán)境:https://portswigger.net/web-security/request-smuggling
這里把原版翻譯(機(jī)翻)一下绿语,再附上解題過程
1.什么是HTTP請(qǐng)求走私劳景?
HTTP請(qǐng)求走私是一種干擾網(wǎng)站處理從一個(gè)或多個(gè)用戶接收的HTTP請(qǐng)求序列的方式的技術(shù)。請(qǐng)求走私漏洞在本質(zhì)上通常是至關(guān)重要的梯投,允許攻擊者繞過安全控制,獲得對(duì)敏感數(shù)據(jù)的未經(jīng)授權(quán)的訪問余素,并直接危害其他應(yīng)用程序用戶蒙兰。
注
http請(qǐng)求走私最早記錄在2005年闻鉴,最近又由portswigger研究關(guān)于這個(gè)話題茵乱。
2.HTTP請(qǐng)求走私攻擊會(huì)發(fā)生什么?
今天的Web應(yīng)用程序經(jīng)常在用戶和最終應(yīng)用程序邏輯之間使用HTTP服務(wù)器鏈孟岛。用戶將請(qǐng)求發(fā)送到前端服務(wù)器(有時(shí)稱為負(fù)載均衡器或反向代理)瓶竭,此服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)給一個(gè)或多個(gè)后端服務(wù)器。這種架構(gòu)在現(xiàn)代基于云的應(yīng)用程序中越來越普遍蚀苛,在某些情況下是不可避免的在验。
當(dāng)前端服務(wù)器將HTTP請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器時(shí)玷氏,通常會(huì)通過相同的后端網(wǎng)絡(luò)連接發(fā)送多個(gè)請(qǐng)求堵未,因?yàn)檫@樣做的效率和性能要高得多。協(xié)議非常簡單:一個(gè)接一個(gè)地發(fā)送HTTP請(qǐng)求盏触,接收服務(wù)器解析HTTP請(qǐng)求頭渗蟹,以確定一個(gè)請(qǐng)求的結(jié)束位置和下一個(gè)請(qǐng)求開始的位置:
在這種情況下块饺,前端和后端系統(tǒng)必須就請(qǐng)求之間的邊界達(dá)成一致。否則雌芽,攻擊者可能會(huì)發(fā)送由前端系統(tǒng)和后端系統(tǒng)不同解釋的模糊請(qǐng)求:
在這里授艰,攻擊者將其前端請(qǐng)求的一部分由后端服務(wù)器解釋為下一個(gè)請(qǐng)求的開始。它有效地優(yōu)先于下一個(gè)請(qǐng)求世落,因此可能會(huì)干擾應(yīng)用程序處理該請(qǐng)求的方式淮腾。這是一次請(qǐng)求走私攻擊,可能會(huì)造成毀滅性的后果屉佳。
3.HTTP請(qǐng)求走私漏洞是如何產(chǎn)生的谷朝?
大多數(shù)HTTP請(qǐng)求走私漏洞的出現(xiàn)是因?yàn)镠TTP規(guī)范提供了兩種不同的方法來指定請(qǐng)求的結(jié)束位置:內(nèi)容長度頭和傳輸編碼頭球。
這個(gè)內(nèi)容長度標(biāo)頭很簡單:它指定消息體的長度(以字節(jié)為單位)武花。例如:
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=smuggling
這個(gè)傳輸編碼標(biāo)頭可用于指定消息主體使用分組編碼圆凰。這意味著消息體包含一個(gè)或多個(gè)數(shù)據(jù)塊。每個(gè)塊包含以字節(jié)為單位的塊大小(以十六進(jìn)制表示)体箕,后面是換行符专钉,后面是塊內(nèi)容。消息以0大小的塊結(jié)束累铅。例如:
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
b
q=smuggling
0
注
許多安全測(cè)試人員不知道可以在HTTP請(qǐng)求中使用分組編碼跃须,原因有二:
- Burp Suite自動(dòng)解壓分組編碼,使消息更易于查看和編輯娃兽。
- 瀏覽器通常不會(huì)在請(qǐng)求中使用分塊編碼回怜,而且通常只在服務(wù)器響應(yīng)中看到。
如果前端服務(wù)器和后端服務(wù)器的行為與傳輸編碼標(biāo)頭换薄,那么它們可能在連續(xù)請(qǐng)求之間的邊界上存在分歧玉雾,從而導(dǎo)致請(qǐng)求走私漏洞。
4.如何執(zhí)行HTTP請(qǐng)求走私攻擊
請(qǐng)求走私攻擊包括將內(nèi)容長度頭和傳輸編碼報(bào)頭進(jìn)入單個(gè)HTTP請(qǐng)求并對(duì)這些請(qǐng)求進(jìn)行操作轻要,以便前端服務(wù)器和后端服務(wù)器處理請(qǐng)求的方式不同复旬。具體的方式取決于這兩個(gè)服務(wù)器的行為:
- CL.TE:前端服務(wù)器使用內(nèi)容長度頭和后端服務(wù)器使用傳輸編碼頭球。
- TE.CL:前端服務(wù)器使用傳輸編碼頭和后端服務(wù)器使用內(nèi)容長度頭球冲泥。
- TE.TE:前端和后端服務(wù)器都支持傳輸編碼頭驹碍,但其中一臺(tái)服務(wù)器可以通過某種方式混淆報(bào)頭,從而避免對(duì)其進(jìn)行處理凡恍。
5.CL.TE漏洞
在這里志秃,前端服務(wù)器使用內(nèi)容長度頭和后端服務(wù)器使用傳輸編碼頭球。我們可以執(zhí)行以下簡單的HTTP請(qǐng)求走私攻擊:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
前端服務(wù)器處理內(nèi)容長度標(biāo)頭嚼酝,并確定請(qǐng)求正文長度為13字節(jié)浮还,直到走私...此請(qǐng)求被轉(zhuǎn)發(fā)到后端服務(wù)器。
后端服務(wù)器處理傳輸編碼標(biāo)頭闽巩,因此將消息體視為使用塊編碼钧舌。它處理第一個(gè)塊担汤,它聲明為零長度,因此被視為終止請(qǐng)求洼冻。以下字節(jié)崭歧,走私,而后端服務(wù)器將將其視為序列中下一個(gè)請(qǐng)求的開始撞牢。
下面開始解題:
打開題目后:
然后點(diǎn)擊Access the lab開啟實(shí)驗(yàn)環(huán)境
用burp攔截一下訪問主頁的請(qǐng)求
直接發(fā)送到Reperter然后右鍵變更請(qǐng)求方法,把方法變成POST
因?yàn)槭荂L.TE的題目
所以前端服務(wù)器認(rèn)CL,而后端服務(wù)器認(rèn)TE那么把包體改一下
Content-Length的話burp會(huì)自動(dòng)幫我們改的,Transfer-Encoding: chunked需要我們自己加上
然后當(dāng)我們請(qǐng)求發(fā)送到前端服務(wù)器的時(shí)候,前端服務(wù)器人CL,認(rèn)為這是一整個(gè)的包,直接發(fā)送給后端,后端服務(wù)器人TE,認(rèn)為這是一個(gè)分塊傳輸?shù)陌?讀到包體中的0然后又讀到兩個(gè)空行,認(rèn)為一個(gè)請(qǐng)求結(jié)束了,對(duì)請(qǐng)求做出響應(yīng),然后后端服務(wù)器的緩沖區(qū)里還留下了一個(gè)G,這個(gè)G就會(huì)留在緩沖區(qū)里(通常10s后會(huì)過期)和下一個(gè)請(qǐng)求拼接到一起
我們直接發(fā)包兩次,第一次進(jìn)行HTTP走私,第二次模擬正常用戶
第一次發(fā)包后會(huì)得到正常的響應(yīng),但是第二次會(huì)得到
Unrecognized method GPOST
就是因?yàn)榈谝淮握?qǐng)求留下的G和第二次請(qǐng)求頭的POST拼接到了一起導(dǎo)致的
6.TE.CL漏洞
在這里率碾,前端服務(wù)器使用傳輸編碼頭和后端服務(wù)器使用內(nèi)容長度頭球。我們可以執(zhí)行以下簡單的HTTP請(qǐng)求走私攻擊:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
注
要使用BurpRepeater發(fā)送此請(qǐng)求屋彪,首先需要轉(zhuǎn)到Repeater菜單播掷,并確保未選中“UpdateContent-Length”選項(xiàng)。
您需要包含尾隨序列0后面的r\n\r\n.
前端服務(wù)器處理傳輸編碼標(biāo)頭撼班,因此將消息體視為使用塊編碼歧匈。它處理第一個(gè)塊,它被聲明為8個(gè)字節(jié)長砰嘁,直到下面一行的開頭走私...它處理第二個(gè)塊件炉,它聲明為零長度,因此被視為終止請(qǐng)求矮湘。此請(qǐng)求被轉(zhuǎn)發(fā)到后端服務(wù)器斟冕。
后端服務(wù)器處理內(nèi)容長度標(biāo)頭,并確定請(qǐng)求體長度為3字節(jié)缅阳,直到下面一行的開頭8...以下字節(jié)磕蛇,以走私,而后端服務(wù)器將將其視為序列中下一個(gè)請(qǐng)求的開始十办。
點(diǎn)擊Access the lab打開實(shí)驗(yàn)環(huán)境后,用burp抓一個(gè)訪問首頁的包,右鍵發(fā)送到Repeater,然后右鍵變更請(qǐng)求方法把GET變成POST方法
因?yàn)檫@次是TE.CL方式的題目
所以前端服務(wù)器認(rèn)Transfer-Encoding,后端服務(wù)器人Content-Length
把包體改成這樣
改成這樣是方便測(cè)試是不是能成功測(cè)試這個(gè)漏洞
發(fā)送兩次后
好的,這個(gè)形式是可以的利用漏洞的
這個(gè)包發(fā)送到前端服務(wù)器后,前端服務(wù)器認(rèn)TE,認(rèn)為這是一個(gè)分塊傳輸?shù)陌?先識(shí)別1(十六進(jìn)制)然后讀取1個(gè)字符,再識(shí)別0和其后面的\r\n\r\n認(rèn)為請(qǐng)求結(jié)束,就發(fā)送給后端了,后端收到包后認(rèn)CL一看CL是3就讀取了3個(gè)字符(1\r\n),然后認(rèn)為包結(jié)束了,那G\r\n0\r\n\r\n就留在后端服務(wù)器的緩沖區(qū)里面了就會(huì)與下一次的請(qǐng)求拼接到一起了形成
Unrecognized method G0POST
但是題目要求我們實(shí)現(xiàn)GPOST
那就自己偽造請(qǐng)求頭吧
這里55是十六進(jìn)制的數(shù),代表了55下面一行到0上面一行這之間的字符數(shù)量,我這里就是
GPOST / HTTP/1.1\r\nHost: ac531f741fc6086980080ac6000c004a.web-security-academy.net\r\n\r\n
這個(gè)數(shù)量可能不好計(jì)算,我寫了個(gè)python3的代碼,可以參考一下
# 專門用來計(jì)算chunked的長度
# 用在TE.CL模式的 第一個(gè)分塊的長度計(jì)算
# 請(qǐng)把你的內(nèi)容放在第三個(gè)雙引號(hào)后面 a = """"""
a = """GPOST / HTTP/1.1
Host: ac531f741fc6086980080ac6000c004a.web-security-academy.net
"""
# a = """"""
n_num = 0
for i in a:
if i == '\n':
n_num += 1
print(hex(len(a) + n_num)[2:])
7. TE.TE行為:混淆TE頭
在這里秀撇,前端服務(wù)器和后端服務(wù)器都支持傳輸編碼頭,但其中一臺(tái)服務(wù)器可以通過某種方式混淆報(bào)頭向族,從而避免對(duì)其進(jìn)行處理呵燕。
有潛在的無窮盡的方法來混淆傳輸編碼頭球。例如:
1
Transfer-Encoding: xchunked
2
Transfer-Encoding : chunked
3
Transfer-Encoding: chunked
Transfer-Encoding: x
4
Transfer-Encoding:[tab]chunked
5
[space]Transfer-Encoding: chunked
6
X: X[\n]Transfer-Encoding: chunked
7
Transfer-Encoding
: chunked
據(jù)我測(cè)試6和7是不支持的,1件相、2再扭、5對(duì)于本題是不能用的,4不能用來解題,3可以
這些技術(shù)中的每一種都涉及到與HTTP規(guī)范的微妙背離夜矗。實(shí)現(xiàn)協(xié)議規(guī)范的真實(shí)世界代碼很少以絕對(duì)精確的方式依附它泛范,而且不同的實(shí)現(xiàn)通常會(huì)容忍與規(guī)范不同的變化。要發(fā)現(xiàn)TEt.E漏洞紊撕,必須找到傳輸編碼標(biāo)頭罢荡,使得只有一個(gè)前端或后端服務(wù)器處理它,而另一個(gè)服務(wù)器忽略它。
取決于可以誘導(dǎo)不處理模糊處理的是前端服務(wù)器還是后端服務(wù)器柠傍。傳輸編碼標(biāo)頭時(shí),其余的攻擊將采取與前面描述的CL.TE或TE.CL漏洞相同的形式辩稽。
這個(gè)題目是前端會(huì)被混淆惧笛,后端不會(huì)被混淆
前端看到
Transfer-Encoding:chunked
Transfer-encoding:cow
認(rèn)為這還是TE型的包,
但是后端服務(wù)器認(rèn)為這不對(duì)勁逞泄,應(yīng)該按照CL格式來看
連發(fā)兩次患整,成功
下篇:Finding HTTP request smuggling vulnerabilities - 查找HTTP請(qǐng)求走私漏洞