HTTP request smuggling - HTTP協(xié)議走私

實(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)用程序用戶蒙兰。


image.png


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)求開始的位置:


image.png

在這種情況下块饺,前端和后端系統(tǒng)必須就請(qǐng)求之間的邊界達(dá)成一致。否則雌芽,攻擊者可能會(huì)發(fā)送由前端系統(tǒng)和后端系統(tǒng)不同解釋的模糊請(qǐng)求:


image.png

在這里授艰,攻擊者將其前端請(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)求的開始撞牢。

可以直接打開實(shí)驗(yàn)環(huán)境

下面開始解題:
打開題目后:
image.png

然后點(diǎn)擊Access the lab開啟實(shí)驗(yàn)環(huán)境
image.png

用burp攔截一下訪問主頁的請(qǐng)求
直接發(fā)送到Reperter然后右鍵變更請(qǐng)求方法,把方法變成POST
這樣一個(gè)GET請(qǐng)求就被變成POST請(qǐng)求了

因?yàn)槭荂L.TE的題目
所以前端服務(wù)器認(rèn)CL,而后端服務(wù)器認(rèn)TE那么把包體改一下
image.png

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走私,第二次模擬正常用戶
image.png

第一次發(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)求的開始十办。

image.png

跟剛才一樣

點(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
把包體改成這樣
image.png

改成這樣是方便測(cè)試是不是能成功測(cè)試這個(gè)漏洞
發(fā)送兩次后
image.png

好的,這個(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)求頭吧
image.png

這里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漏洞相同的形式辩稽。

image.png

這個(gè)題目是前端會(huì)被混淆惧笛,后端不會(huì)被混淆
image.png

前端看到
Transfer-Encoding:chunked
Transfer-encoding:cow
認(rèn)為這還是TE型的包,
但是后端服務(wù)器認(rèn)為這不對(duì)勁逞泄,應(yīng)該按照CL格式來看
連發(fā)兩次患整,成功
image.png

下篇:Finding HTTP request smuggling vulnerabilities - 查找HTTP請(qǐng)求走私漏洞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喷众,隨后出現(xiàn)的幾起案子各谚,更是在濱河造成了極大的恐慌,老刑警劉巖到千,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昌渤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡憔四,警方通過查閱死者的電腦和手機(jī)膀息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來了赵,“玉大人潜支,你說我怎么就攤上這事∈裂矗” “怎么了冗酿?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長络断。 經(jīng)常有香客問我裁替,道長,這世上最難降的妖魔是什么貌笨? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任胯究,我火速辦了婚禮,結(jié)果婚禮上躁绸,老公的妹妹穿的比我還像新娘裕循。我一直安慰自己,他們只是感情好净刮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布剥哑。 她就那樣靜靜地躺著,像睡著了一般淹父。 火紅的嫁衣襯著肌膚如雪株婴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音困介,去河邊找鬼大审。 笑死,一個(gè)胖子當(dāng)著我的面吹牛座哩,可吹牛的內(nèi)容都是我干的徒扶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼根穷,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼姜骡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屿良,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤圈澈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尘惧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體康栈,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年喷橙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谅将。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡重慢,死狀恐怖饥臂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情似踱,我是刑警寧澤隅熙,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站核芽,受9級(jí)特大地震影響囚戚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轧简,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一驰坊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哮独,春花似錦拳芙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悴务,卻和暖如春睹限,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工羡疗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留染服,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓叨恨,卻偏偏與公主長得像柳刮,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子特碳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355