0x00 背景
CRLFInjection很少遇見疲吸,這次被我逮住了捍岳。我看zone中(http://zone.wooyun.org/content/13323)還有一些同學對于這個漏洞不甚了解,甚至分不清它與CSRF菜谣,我詳細說一下吧惭缰。
CRLF是”回車+換行”(\r\n)的簡稱浪南。在HTTP協(xié)議中,HTTPHeader與HTTPBody是用兩個CRLF分隔的漱受,瀏覽器就是根據(jù)這兩個CRLF來取出HTTP內(nèi)容并顯示出來络凿。所以,一旦我們能夠控制HTTP消息頭中的字符昂羡,注入一些惡意的換行喷众,這樣我們就能注入一些會話Cookie或者HTML代碼,所以CRLFInjection又叫HTTPResponseSplitting紧憾,簡稱HRS。
HRS是比XSS危害更大的安全問題昌渤,具體是為什么赴穗,我們往下看。
對于HRS最簡單的利用方式是注入兩個\r\n膀息,之后在寫入XSS代碼般眉,來構造一個xss。
0x01 實例
舉個例子潜支,一般網(wǎng)站會在HTTP頭中用Location:http://baidu.com這種方式來進行302跳轉甸赃,所以我們能控制的內(nèi)容就是Location:后面的XXX某個網(wǎng)址。
所以一個正常的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貌笨。
比如一個網(wǎng)站接受url參數(shù)http://test.sina.com.cn/?url=xxx,xxx放在Location后面作為一個跳轉襟沮。如果我們輸入的是
http://test.sina.com.cn/?url=%0d%0a%0d%0a<imgsrc=1onerror=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/)>
之前說了瀏覽器會根據(jù)第一個CRLF把HTTP包分成頭和體锥惋,然后將體顯示出來。于是我們這里這個標簽就會顯示出來开伏,造成一個XSS膀跌。
為什么說是無視瀏覽器filter的,這里涉及到另一個問題固灵。
瀏覽器的Filter是瀏覽器應對一些反射型XSS做的保護策略捅伤,當url中含有XSS相關特征的時候就會過濾掉不顯示在頁面中,所以不能觸發(fā)XSS怎虫。
怎樣才能關掉filter暑认?一般來說用戶這邊是不行的,只有數(shù)據(jù)包中http頭含有X-XSS-Protection并且值為0的時候大审,瀏覽器才不會開啟filter蘸际。
說到這里應該就很清楚了,HRS不正是注入HTTP頭的一個漏洞嗎徒扶,我們可以將X-XSS-Protection:0注入到數(shù)據(jù)包中粮彤,再用兩個CRLF來注入XSS代碼,這樣就成功地繞過了瀏覽器filter姜骡,并且執(zhí)行我們的反射型XSS导坟。
所以說HRS的危害大于XSS,因為它能繞過一般XSS所繞不過的filter圈澈,并能產(chǎn)生會話固定漏洞惫周。
我們來一個真實案例吧。 新浪某分站含有一個url跳轉漏洞康栈,危害并不大递递,于是我就想到了CRLFInjection,當我測試
http://xxx.sina.com.cn/?url=%0a%0d%0a%0d%3Cimg%20src=1%3E
的時候啥么,發(fā)現(xiàn)圖片已經(jīng)輸出在頁面中了登舞,說明CRLF注入成功了:
那么我們試試XSS看看:
@mramydnei還想到了一個利用字符編碼來繞過XSSFilter的方法,當編碼是is-2022-kr時瀏覽器會忽略%0f悬荣,這樣我們在onerror后面加個%0f就能繞過filter菠秒,前提是注入一個
<metacharset=ISO-2022-KR>
當然,在Location:這里注入只有webkit內(nèi)核瀏覽器才能夠利用氯迂,其他瀏覽器可能會跳轉践叠、出錯言缤。不過對于chrome的使用量來說,危害已經(jīng)足夠了酵熙。
0x02 修復
如何修復HRS漏洞轧简,當然是過濾\r、\n之類的換行符匾二,避免輸入的數(shù)據(jù)污染到其他HTTP頭哮独。