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