利用效果
攻擊者通過(guò)構(gòu)造特殊post包使下一位用戶的http包頭被篡改瓶殃。(在這里我實(shí)現(xiàn)當(dāng)?shù)诙挥脩粼L問(wèn)該服務(wù)器時(shí)在評(píng)論區(qū)輸出該用戶的報(bào)頭內(nèi)容)利用原理
什么是HTTP請(qǐng)求走私
HTTP請(qǐng)求走私是一種干擾網(wǎng)站處理從一個(gè)或多個(gè)用戶接收的HTTP請(qǐng)求序列的方式的技術(shù)。請(qǐng)求走私漏洞本質(zhì)上通常很關(guān)鍵蝌麸,它使攻擊者可以繞過(guò)安全控制,未經(jīng)授權(quán)訪問(wèn)敏感數(shù)據(jù)并直接危害其他應(yīng)用程序用戶史辙。
HTTP協(xié)議特點(diǎn)概述
1.HTTP協(xié)議是一個(gè)應(yīng)用層協(xié)議诵姜,由請(qǐng)求-響應(yīng)夠成,是一個(gè)標(biāo)準(zhǔn)的客戶端服務(wù)器模型冻记。
2.HTTP協(xié)議簡(jiǎn)單快速睡毒,客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只用傳送請(qǐng)求方法和請(qǐng)求路徑冗栗。常見(jiàn)的請(qǐng)求方法有POST,GET,HEAD等等
3.無(wú)連接演顾,每次http連接只處理一個(gè)請(qǐng)求供搀,服務(wù)器響應(yīng)完客戶端的請(qǐng)求并收到應(yīng)答后就斷開連接。
4.無(wú)狀態(tài)偶房,所謂無(wú)狀態(tài)是指協(xié)議對(duì)事務(wù)處理沒(méi)有記憶能力趁曼。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息军浆,則需要重傳棕洋。
用戶請(qǐng)求發(fā)送到前端服務(wù)器(CDN/反向代理),并且該服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)或多個(gè)后端服務(wù)器乒融,當(dāng)前端服務(wù)器將HTTP請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器時(shí)掰盘,它通常會(huì)通過(guò)同一后端網(wǎng)絡(luò)連接發(fā)送多個(gè)請(qǐng)求,因?yàn)檫@樣效率更高赞季。
走私原理
如果說(shuō)前端和后端系統(tǒng)對(duì)同一請(qǐng)求報(bào)頭的處理方式不同撒遣,我們發(fā)送一個(gè)模棱兩可的請(qǐng)求邮偎,該請(qǐng)求就會(huì)被前后端以不同的方式解釋:
前端服務(wù)器處理CL,并確定請(qǐng)求體長(zhǎng)度為6個(gè)字節(jié)(\r\n0\r\nG)湃累。該請(qǐng)求被轉(zhuǎn)發(fā)到后端服務(wù)器勃救,后端服務(wù)器處理TE標(biāo)頭,認(rèn)為消息為分塊編碼治力。處理第一塊時(shí)該塊聲明長(zhǎng)度為0蒙秒,被視為終止請(qǐng)求,那么后面那個(gè)G就被留在緩沖區(qū)未被處理宵统,后端服務(wù)器將會(huì)認(rèn)為他是下一個(gè)HTTP請(qǐng)求的開始部分晕讲。當(dāng)?shù)诙€(gè)請(qǐng)求過(guò)來(lái)時(shí)覆获,就會(huì)收到類似“Unknown method GPOST”的響應(yīng)。
利用過(guò)程
我們?cè)谶@里實(shí)現(xiàn)一個(gè)讓下一個(gè)請(qǐng)求同一服務(wù)器的用戶在指定頁(yè)面留下自己HTTP請(qǐng)求頭的功能瓢省。實(shí)驗(yàn)環(huán)境傳送門
填好評(píng)論后發(fā)一個(gè)正常的包弄息,評(píng)論的內(nèi)容由comment參數(shù)控制,如果評(píng)論成功則返回302跳轉(zhuǎn)勤婚。
接下來(lái)構(gòu)造一個(gè)惡意的請(qǐng)求摹量,讓第二個(gè)訪問(wèn)該服務(wù)器的用戶自動(dòng)評(píng)論并留下他的請(qǐng)求頭
為了觀眾老爺看著清楚,我們把第二位訪問(wèn)者評(píng)論時(shí)的名字改為Second馒胆,comment參數(shù)放在最后用于接收請(qǐng)求頭缨称,下面的Content-Length可以自行修改以控制截取下一位訪問(wèn)者的報(bào)頭長(zhǎng)度。這里我們先截取500個(gè)祝迂,點(diǎn)擊go睦尽,返回400,后端認(rèn)為我們的消息長(zhǎng)度為0型雳,實(shí)際上当凡,下面的一段惡意的請(qǐng)求頭已經(jīng)存在了后端服務(wù)器的緩存中,換個(gè)瀏覽器訪問(wèn)一下:
直接提示評(píng)論成功纠俭,然后回到評(píng)論區(qū)看一下是否留下了訪問(wèn)者的信息
因?yàn)槌鑫覀兘厝〉牟糠诌€是留在了服務(wù)器的緩存區(qū)沿量,當(dāng)再次訪問(wèn)該服務(wù)器,它會(huì)返回400柑晒。
再次請(qǐng)求時(shí)就會(huì)正常顯示欧瘪。
至此一次HTTP請(qǐng)求走私完成!
還有前端處理TE標(biāo)頭匙赞、后端處理CL標(biāo)頭(TE.CL)佛掖,前后端都處理TE標(biāo)頭時(shí)混淆(TE.TE)等情況與此原理相似,相信大家可以舉一反三涌庭,這里就不一一贅述了芥被。(溜了。坐榆。拴魄。。)
參考文檔
-
分塊編碼是HTTP1.1協(xié)議中定義的Web用戶向服務(wù)器提交數(shù)據(jù)的一種方法席镀,當(dāng)服務(wù)器收到chunked編碼方式的數(shù)據(jù)時(shí)匹中,會(huì)分配一個(gè)緩沖區(qū)存放數(shù)據(jù),如果提交的數(shù)據(jù)大小未知豪诲,客戶端會(huì)議一個(gè)協(xié)商好的分塊大小向服務(wù)器提交數(shù)據(jù)顶捷。 ?