CRLF注入
背景
CRLF是”回車+換行”(\r\n)的簡稱。在HTTP協議中,HTTPHeader與HTTPBody是用兩個CRLF分隔的,瀏覽器就是根據這兩個CRLF來取出HTTP內容並顯示出來。所以,一旦我們能夠控制HTTP訊息頭中的字元,注入一些惡意的換行,這樣我們就能注入一些會話Cookie或者HTML程式碼,所以CRLFInjection又叫HTTPResponseSplitting,簡稱HRS。
HRS是比XSS危害更大的安全問題,具體是為什麼,我們往下看。
對於HRS最簡單的利用方式是注入兩個\r\n,之後在寫入XSS程式碼,來構造一個xss。
示例
舉個例子,一般網站會在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 οnerrοr=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 οnerrοr=alert(/xss/)>
瀏覽器的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,並能產生會話固定漏洞。
修復
過濾 \r 、\n 之類的行結束符,避免輸入的資料汙染其他 HTTP 首部欄位。