1. 程式人生 > >Web安全-檢測-CRLF

Web安全-檢測-CRLF

背景知識

在文字處理中, CR, LF, CR/LF是不同作業系統上使用的換行符.Dos和windows採用回車+換行CR/LF表示下一行,而UNIX/Linux採用換行符LF表示下一行,蘋果機(MAC OS系統)則採用回車符CR表示下一行.CR用符號’r’表示, 十進位制ASCII程式碼是13, 十六進位制程式碼為0x0D; LF使用’n’符號表示, ASCII程式碼是10, 十六製為0x0A.所以Windows平臺上換行在文字檔案中是使用 0d 0a 兩個位元組表示, 而UNIX和蘋果平臺上換行則是使用0a或0d一個位元組表示。
CRLF注入在OWASP 裡面被稱為HTTP拆分攻擊(HTTP Splitting),CRLF是”回車 + 換行”(\r\n)的簡稱。在HTTP協議中,HTTP Header與HTTP Body是用兩個CRLF分隔的,瀏覽器就是根據這兩個CRLF來取出HTTP 內容並顯示出來。所以,一旦我們能夠控制HTTP 訊息頭中的字元,注入一些惡意的換行,這樣我們就能注入一些會話Cookie或者HTML程式碼。
通過CRLF注入,攻擊者可以實現HTTP請求走私(HTTP Request Smuggling)和HTTP響應拆分(HTTP Response Splitting)。
就http請求走私而言,這種漏洞通常出現在當伺服器接收http請求並將該請求轉發給其他伺服器時,比如說代理和防火牆,這種漏洞將造成如下問題:

  • 快取毒化–攻擊者可以修改快取中的內容然後不顯示正常頁面而顯示惡意頁面。
  • 防火牆逃逸–攻擊者通過構造資料包來逃避安全檢查,通常會利用CRLF和構造超大的資料包
  • 請求劫持–攻擊者可以通過該利用獲取HttpOnly的cookie和http認證資料,類似於xss但是不需要攻擊者和黑客進行互動。
    對於http響應拆分,攻擊者通過插入CRLF字元後就可以實現在響應頭部中插入任意資料,控制響應的資料內容等。

舉例

一般網站會在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。

參考資料

http://byd.dropsec.xyz/2016/08/31/CRLF-injection漏洞/
https://evilanne.github.io/2016/06/21/CRLF注入/
https://zhuanlan.zhihu.com/p/22953209
https://wps2015.org/drops/drops/CRLF Injection漏洞的利用與例項分析.html