浅谈HTTP响应拆分攻击(一)
生活随笔
收集整理的這篇文章主要介紹了
浅谈HTTP响应拆分攻击(一)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在本文中,我們將探討何謂HTTP響應(yīng)拆分以及攻擊行為是怎樣進(jìn)行的。一旦徹底理解了其發(fā)生原理(該原理往往被人所誤解),我們就可以探究如何利用響應(yīng)拆分執(zhí)行跨站點(diǎn)腳本(簡稱XSS)。接下來自然就是討論如果目標(biāo)網(wǎng)站存在響應(yīng)拆分漏洞,我們要如何利用這一機(jī)會(huì)組織CSRF(即跨站點(diǎn)偽造請(qǐng)求)攻擊。最后,我們一起來看看哪些預(yù)防措施能夠抵御這些攻擊行為。如果大家對(duì)這個(gè)話題感興趣,不妨繼續(xù)讀下去。什么是HTTP響應(yīng)拆分??
首先讓我們?cè)O(shè)想一下某個(gè)具備多種語言選項(xiàng)的頁面。該頁面的默認(rèn)語言為英語,但其中同時(shí)具備一個(gè)下拉菜單,允許我們?cè)谶x定其中對(duì)應(yīng)的其它語種后,整個(gè)頁面的語言也同時(shí)發(fā)生切換。比方說根據(jù)初始頁面的配置,302重新指向的結(jié)果為http://www.abc.com/index.php?lang=en。但對(duì)于來自德國的用戶而言,當(dāng)然希望頁面內(nèi)容以德語呈現(xiàn),這時(shí)他們就可以從下拉菜單的備用語言中進(jìn)行選擇。這使得302重新指向?qū)⒈话l(fā)往服務(wù)器上的德語頁面——http://www.abc.com/index.php?lang=german。用戶的瀏覽器會(huì)遵循重新指向的引導(dǎo),并將德語頁面正常呈現(xiàn)出來。?
現(xiàn)在讓我們思考一下HTTP 302重新指向響應(yīng)的主體內(nèi)容。內(nèi)容大體如下:?
HTTP/1.1 302 Moved Temporarily?
Location:?http://www.abc.com/index.php?lang=en
或者是:?
HTTP/1.1 302 Moved Temporarily?
Location:?http://www.abc.com/index.php?lang=german
大家可能已經(jīng)發(fā)現(xiàn)了,惟一產(chǎn)生變化的只有l(wèi)ang參數(shù)的值。也就是說,這個(gè)值是由用戶所控制,我們可以將該值設(shè)置為任何想要的內(nèi)容。正是這種特性導(dǎo)致了HTTP響應(yīng)拆分攻擊的發(fā)生。?
此時(shí)我們不再把參數(shù)值設(shè)定為"german",而是按照下列內(nèi)容進(jìn)行設(shè)定:?
a) The value 'german'?
b) CR/LF - %0d%0a?
c) A response with Content Length 0 [這里之所以設(shè)長度為0,是因?yàn)檫@一段其實(shí)無關(guān)緊要]?
d) CR/LF - %0d%0a?
e) A response which contains malicious content [舉例來說,可以設(shè)定JavaScript會(huì)在頁面被訪問時(shí)自動(dòng)下載惡意軟件]?
先來看看c)的內(nèi)容--這也是首個(gè)響應(yīng)。HTTP協(xié)議的工作方式是一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)響應(yīng),因此針對(duì)該請(qǐng)求——即http://www.abc.com/index.php?lang=german的響應(yīng)是經(jīng)過精心設(shè)計(jì)的。其實(shí)我們并不關(guān)心這個(gè)響應(yīng)本身及其內(nèi)容,我們想要的只是將Content-Length: 0設(shè)為其響應(yīng)頭。?
CR/LF(即回車換行符)是響應(yīng)之間的分界符。所以只要我們?nèi)鏳)中所示加入CR/LF內(nèi)容,那么第二輪響應(yīng)即會(huì)啟動(dòng),且根據(jù)HTTP協(xié)議的規(guī)定這是完全正常的。在新一輪響應(yīng)中我們可以添加大量信息。舉例來說,如果我們打算顯示一條"Hello, you have been phished"(意為'你好,你已然中招了')的消息,此時(shí)面前已經(jīng)完全沒有任何阻礙了。只需輸入如下所示的內(nèi)容,即可輕松實(shí)現(xiàn):?
HTTP/1.1 200 OK?
Content-Type: text/html?
Content-Length: 41?
Hello, you have been phished?
還是覺得有點(diǎn)迷糊?讓我們?cè)倏偨Y(jié)一次。攻擊者控制參數(shù)并發(fā)送一個(gè)將產(chǎn)生兩次響應(yīng)的請(qǐng)求;這兩次響應(yīng)都由攻擊者組織,并以服務(wù)器為目標(biāo)。首個(gè)響應(yīng)旨在回應(yīng)將頁面轉(zhuǎn)化為德語的請(qǐng)求,而第二個(gè)響應(yīng)(到目前為止)還未經(jīng)解釋,它只是暫時(shí)掛起--因?yàn)樵擁憫?yīng)還沒有能夠映射的對(duì)應(yīng)請(qǐng)求。請(qǐng)記住,HTTP需要響應(yīng)(無論內(nèi)容代碼是什么),但它需要的是一個(gè)能對(duì)應(yīng)所有請(qǐng)求的響應(yīng)。因此掛起中的HTTP響應(yīng)是無法工作的。?
現(xiàn)在請(qǐng)仔細(xì)閱讀…因?yàn)檫@部分正是大多數(shù)人(連我自己在很長一段時(shí)間內(nèi)也是如此)沒有搞清楚的內(nèi)容。為了處理第二個(gè)掛起中的響應(yīng),攻擊者會(huì)迅速對(duì)服務(wù)器上的頁面發(fā)送一條有效的公開訪問(通常是這樣)請(qǐng)求,比如說branches.html。?
這里假設(shè)他發(fā)送的請(qǐng)求為:?
GET /branches.html HTTP/1.1?
Host:?www.abc.com
就在發(fā)出首個(gè)包含"可完全自定內(nèi)容"參數(shù)的請(qǐng)求之后,他會(huì)旋即發(fā)出上述第二條請(qǐng)求,而這也正是"Hello, you have been phished"字段的映射對(duì)象。兩條請(qǐng)求對(duì)應(yīng)兩次響應(yīng),大家明白了嗎??
哈哈,恐怕各位還是有些困惑。盡管大家可能已經(jīng)了解整個(gè)映射的發(fā)生過程,但仍然沒鬧明白這種攻擊是如何影響其他人的。畢竟,攻擊者的這一切行動(dòng)都發(fā)生在他自己的計(jì)算機(jī)上,所修改的請(qǐng)求也只限于他個(gè)人…也就是說,會(huì)受影響的只有他自己。說實(shí)話,為什么攻擊者要對(duì)自身展開攻勢(shì)?這似乎毫無道理可言啊。不過我要指出的是,這對(duì)位于中間幀及緩存中的代理服務(wù)器或者某些設(shè)備而言,可以說是接納請(qǐng)求及響應(yīng)的關(guān)鍵性一環(huán)。?
攻擊者必須躲在代理服務(wù)器之后,并借助代理將他的請(qǐng)求發(fā)送到互聯(lián)網(wǎng)上的目標(biāo)服務(wù)器處。如果他想感染其它用戶,這些被害用戶也必須處于同樣的代理服務(wù)器之后。因此,讓我們?cè)賮砜偨Y(jié)一次(請(qǐng)保持耐性…)?
a)攻擊者發(fā)送一條包含一個(gè)值及兩次響應(yīng)的請(qǐng)求,使用%0d%0a進(jìn)行分隔。在本文的例子中,請(qǐng)求的內(nèi)容如下:?
http://www.abc.com/index.php?lang=german%0d%0aContent- Length:%200%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2041%0d%0aHello, you have been phished?
b)該請(qǐng)求的發(fā)送目的地為www.abc.com…不過重要的是,它是通過中間代理服務(wù)器進(jìn)行傳遞的。因此現(xiàn)在在代理服務(wù)器上,第一個(gè)請(qǐng)求被映射在第一次響應(yīng)上,而第二次響應(yīng)則由于沒有能夠匹配的請(qǐng)求而處于掛起狀態(tài)。?
c)在首個(gè)請(qǐng)求發(fā)出后,攻擊者會(huì)立即向目標(biāo)網(wǎng)站(同樣通過代理服務(wù)器)發(fā)出新請(qǐng)求(第二個(gè)請(qǐng)求),內(nèi)容如下:?
GET /branches.html HTTP/1.1?
Host:?www.abc.com
d)代理服務(wù)器會(huì)在收到branches.html后,第一時(shí)間將其映射至第二次響應(yīng)中(即'You have been phished ')。因此接下來發(fā)往branches.html的請(qǐng)求將不再顯示銀行的分支機(jī)構(gòu)名單,而是指向惡意網(wǎng)頁。沒錯(cuò),對(duì)于每位訪問者畢竟是如此,而不僅僅針對(duì)攻擊者。為什么會(huì)這樣?因?yàn)檫@正是緩存代理服務(wù)器的處理方式…常發(fā)請(qǐng)求緩存響應(yīng)。也就是說,如果某個(gè)發(fā)往branches.html的請(qǐng)求始終產(chǎn)生同一份關(guān)于銀行支行信息的靜態(tài)列表,那么代理服務(wù)器幾乎肯定會(huì)調(diào)用緩存對(duì)該請(qǐng)求進(jìn)行響應(yīng)。換言之,下一次指向branches.html的請(qǐng)求將自動(dòng)返回來自緩存的響應(yīng)。而在攻擊者的安排下,代理服務(wù)器的緩存內(nèi)容遭受感染,并被迫返回惡意響應(yīng)而非原本的靜態(tài)列表……這種狀況將持續(xù)下去直到緩存過期。?
首先讓我們?cè)O(shè)想一下某個(gè)具備多種語言選項(xiàng)的頁面。該頁面的默認(rèn)語言為英語,但其中同時(shí)具備一個(gè)下拉菜單,允許我們?cè)谶x定其中對(duì)應(yīng)的其它語種后,整個(gè)頁面的語言也同時(shí)發(fā)生切換。比方說根據(jù)初始頁面的配置,302重新指向的結(jié)果為http://www.abc.com/index.php?lang=en。但對(duì)于來自德國的用戶而言,當(dāng)然希望頁面內(nèi)容以德語呈現(xiàn),這時(shí)他們就可以從下拉菜單的備用語言中進(jìn)行選擇。這使得302重新指向?qū)⒈话l(fā)往服務(wù)器上的德語頁面——http://www.abc.com/index.php?lang=german。用戶的瀏覽器會(huì)遵循重新指向的引導(dǎo),并將德語頁面正常呈現(xiàn)出來。?
現(xiàn)在讓我們思考一下HTTP 302重新指向響應(yīng)的主體內(nèi)容。內(nèi)容大體如下:?
HTTP/1.1 302 Moved Temporarily?
Location:?http://www.abc.com/index.php?lang=en
或者是:?
HTTP/1.1 302 Moved Temporarily?
Location:?http://www.abc.com/index.php?lang=german
大家可能已經(jīng)發(fā)現(xiàn)了,惟一產(chǎn)生變化的只有l(wèi)ang參數(shù)的值。也就是說,這個(gè)值是由用戶所控制,我們可以將該值設(shè)置為任何想要的內(nèi)容。正是這種特性導(dǎo)致了HTTP響應(yīng)拆分攻擊的發(fā)生。?
此時(shí)我們不再把參數(shù)值設(shè)定為"german",而是按照下列內(nèi)容進(jìn)行設(shè)定:?
a) The value 'german'?
b) CR/LF - %0d%0a?
c) A response with Content Length 0 [這里之所以設(shè)長度為0,是因?yàn)檫@一段其實(shí)無關(guān)緊要]?
d) CR/LF - %0d%0a?
e) A response which contains malicious content [舉例來說,可以設(shè)定JavaScript會(huì)在頁面被訪問時(shí)自動(dòng)下載惡意軟件]?
先來看看c)的內(nèi)容--這也是首個(gè)響應(yīng)。HTTP協(xié)議的工作方式是一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)響應(yīng),因此針對(duì)該請(qǐng)求——即http://www.abc.com/index.php?lang=german的響應(yīng)是經(jīng)過精心設(shè)計(jì)的。其實(shí)我們并不關(guān)心這個(gè)響應(yīng)本身及其內(nèi)容,我們想要的只是將Content-Length: 0設(shè)為其響應(yīng)頭。?
CR/LF(即回車換行符)是響應(yīng)之間的分界符。所以只要我們?nèi)鏳)中所示加入CR/LF內(nèi)容,那么第二輪響應(yīng)即會(huì)啟動(dòng),且根據(jù)HTTP協(xié)議的規(guī)定這是完全正常的。在新一輪響應(yīng)中我們可以添加大量信息。舉例來說,如果我們打算顯示一條"Hello, you have been phished"(意為'你好,你已然中招了')的消息,此時(shí)面前已經(jīng)完全沒有任何阻礙了。只需輸入如下所示的內(nèi)容,即可輕松實(shí)現(xiàn):?
HTTP/1.1 200 OK?
Content-Type: text/html?
Content-Length: 41?
Hello, you have been phished?
還是覺得有點(diǎn)迷糊?讓我們?cè)倏偨Y(jié)一次。攻擊者控制參數(shù)并發(fā)送一個(gè)將產(chǎn)生兩次響應(yīng)的請(qǐng)求;這兩次響應(yīng)都由攻擊者組織,并以服務(wù)器為目標(biāo)。首個(gè)響應(yīng)旨在回應(yīng)將頁面轉(zhuǎn)化為德語的請(qǐng)求,而第二個(gè)響應(yīng)(到目前為止)還未經(jīng)解釋,它只是暫時(shí)掛起--因?yàn)樵擁憫?yīng)還沒有能夠映射的對(duì)應(yīng)請(qǐng)求。請(qǐng)記住,HTTP需要響應(yīng)(無論內(nèi)容代碼是什么),但它需要的是一個(gè)能對(duì)應(yīng)所有請(qǐng)求的響應(yīng)。因此掛起中的HTTP響應(yīng)是無法工作的。?
現(xiàn)在請(qǐng)仔細(xì)閱讀…因?yàn)檫@部分正是大多數(shù)人(連我自己在很長一段時(shí)間內(nèi)也是如此)沒有搞清楚的內(nèi)容。為了處理第二個(gè)掛起中的響應(yīng),攻擊者會(huì)迅速對(duì)服務(wù)器上的頁面發(fā)送一條有效的公開訪問(通常是這樣)請(qǐng)求,比如說branches.html。?
這里假設(shè)他發(fā)送的請(qǐng)求為:?
GET /branches.html HTTP/1.1?
Host:?www.abc.com
就在發(fā)出首個(gè)包含"可完全自定內(nèi)容"參數(shù)的請(qǐng)求之后,他會(huì)旋即發(fā)出上述第二條請(qǐng)求,而這也正是"Hello, you have been phished"字段的映射對(duì)象。兩條請(qǐng)求對(duì)應(yīng)兩次響應(yīng),大家明白了嗎??
哈哈,恐怕各位還是有些困惑。盡管大家可能已經(jīng)了解整個(gè)映射的發(fā)生過程,但仍然沒鬧明白這種攻擊是如何影響其他人的。畢竟,攻擊者的這一切行動(dòng)都發(fā)生在他自己的計(jì)算機(jī)上,所修改的請(qǐng)求也只限于他個(gè)人…也就是說,會(huì)受影響的只有他自己。說實(shí)話,為什么攻擊者要對(duì)自身展開攻勢(shì)?這似乎毫無道理可言啊。不過我要指出的是,這對(duì)位于中間幀及緩存中的代理服務(wù)器或者某些設(shè)備而言,可以說是接納請(qǐng)求及響應(yīng)的關(guān)鍵性一環(huán)。?
攻擊者必須躲在代理服務(wù)器之后,并借助代理將他的請(qǐng)求發(fā)送到互聯(lián)網(wǎng)上的目標(biāo)服務(wù)器處。如果他想感染其它用戶,這些被害用戶也必須處于同樣的代理服務(wù)器之后。因此,讓我們?cè)賮砜偨Y(jié)一次(請(qǐng)保持耐性…)?
a)攻擊者發(fā)送一條包含一個(gè)值及兩次響應(yīng)的請(qǐng)求,使用%0d%0a進(jìn)行分隔。在本文的例子中,請(qǐng)求的內(nèi)容如下:?
http://www.abc.com/index.php?lang=german%0d%0aContent- Length:%200%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2041%0d%0aHello, you have been phished?
b)該請(qǐng)求的發(fā)送目的地為www.abc.com…不過重要的是,它是通過中間代理服務(wù)器進(jìn)行傳遞的。因此現(xiàn)在在代理服務(wù)器上,第一個(gè)請(qǐng)求被映射在第一次響應(yīng)上,而第二次響應(yīng)則由于沒有能夠匹配的請(qǐng)求而處于掛起狀態(tài)。?
c)在首個(gè)請(qǐng)求發(fā)出后,攻擊者會(huì)立即向目標(biāo)網(wǎng)站(同樣通過代理服務(wù)器)發(fā)出新請(qǐng)求(第二個(gè)請(qǐng)求),內(nèi)容如下:?
GET /branches.html HTTP/1.1?
Host:?www.abc.com
d)代理服務(wù)器會(huì)在收到branches.html后,第一時(shí)間將其映射至第二次響應(yīng)中(即'You have been phished ')。因此接下來發(fā)往branches.html的請(qǐng)求將不再顯示銀行的分支機(jī)構(gòu)名單,而是指向惡意網(wǎng)頁。沒錯(cuò),對(duì)于每位訪問者畢竟是如此,而不僅僅針對(duì)攻擊者。為什么會(huì)這樣?因?yàn)檫@正是緩存代理服務(wù)器的處理方式…常發(fā)請(qǐng)求緩存響應(yīng)。也就是說,如果某個(gè)發(fā)往branches.html的請(qǐng)求始終產(chǎn)生同一份關(guān)于銀行支行信息的靜態(tài)列表,那么代理服務(wù)器幾乎肯定會(huì)調(diào)用緩存對(duì)該請(qǐng)求進(jìn)行響應(yīng)。換言之,下一次指向branches.html的請(qǐng)求將自動(dòng)返回來自緩存的響應(yīng)。而在攻擊者的安排下,代理服務(wù)器的緩存內(nèi)容遭受感染,并被迫返回惡意響應(yīng)而非原本的靜態(tài)列表……這種狀況將持續(xù)下去直到緩存過期。?
希望經(jīng)過上面的詳細(xì)介紹,大家會(huì)對(duì)HTTP響應(yīng)拆分有一個(gè)明確的概念。這里是文章的重中之重,所以不妨多讀幾遍。關(guān)鍵在于,攻擊者發(fā)出的第二條請(qǐng)求會(huì)迫使代理服務(wù)器遵從第二條請(qǐng)求對(duì)應(yīng)第二次響應(yīng)的映射模式。一旦理解了這一點(diǎn),整個(gè)概念應(yīng)該就比較清晰了。
本文轉(zhuǎn)自 ? ?geekwolf ? 51CTO博客,原文鏈接:http://blog.51cto.com/linuxgeek/998970
總結(jié)
以上是生活随笔為你收集整理的浅谈HTTP响应拆分攻击(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: date -d的灵活应用
- 下一篇: nginx 禁止通过IP,未绑定域名访问