CRLF 指的是回車符(CR,ASCII 13,\r,%0d) 和換行符(LF,ASCII 10,\n,%0a),作業系統就是根據這個標識來進行換行的,你在鍵盤輸入回車鍵就是輸出這個字符,只不過win和linux系統采用的標識不一樣而已,
在HTTP當中HTTP的Header和Body之間就是用兩個crlf進行分隔的,如果能控制HTTP訊息頭中的字符,注入一些惡意的換行,這樣就能注入一些會話cookie和html代碼,所以CRLF injection 又叫做 HTTP response Splitting,簡稱HRS,CRLF漏洞可以造成Cookie會話固定和反射型XSS(可過waf)的危害,注入XSS的利用方式:連續使用兩次%0d%oa就會造成header和body之間的分離,就可以在其中插入xss代碼形成反射型xss漏洞,
測驗
CRLF注入漏洞的檢測也和XSS漏洞的檢測差不多,通過修改HTTP引數或URL,注入惡意的CRLF,查看構造的惡意資料是否在回應頭中輸出,主要是在看到有重定向或者跳轉的地方,可以在跳轉的地址添加?url=http://baidu.com/xxx%0a%0dSet-Cookie: test123=123測驗一下,通過查看回應包的資料查看結果,
GET /index.php?c=rpzy&a=query&type=all&value=https://www.cnblogs.com/mysticbinary/p/123&datatype=json&r=X1MU6E86%0a%0dSet-Cookie: test123=123 HTTP/1.1
Host: www.xxxxyou.net

這里并沒有利用成功,如果利用成功的話,回應包會出現一行Set-Cookie: test123=123 資料,
原理分析
HRS漏洞存在的前提是 :url當中輸入的字符會影響到檔案,比如在重定位當中可以嘗試使用%0d%0a作為crlf.
一般網站會在HTTP頭中加上Location: http://baidu.com的方式來進行302跳轉,所以我們能控制的內容就是Location:后面的XXX網址,對這個地址進行污染,
假設服務端(PHP)的處理方式:
if($_COOKIE("security_level") == 1)
{
header("Location: ". $_GET['url']);
exit;
}
代碼意思是說當條件滿足時,將請求包中的url引數值拼接到Location字串中,并設定成回應頭發送給客戶端,
此時服務器端接收到的url引數值是我們修改后的:
http://baidu.com/xxx%0a%0dSet-Cookie: test123=123
在url引數值拼接到Location字串中,設定成回應頭后,回應頭就會看到:
Set-Cookie: test123=123
修復方式
服務端收到前端過來的引數,在加入Location之前,需要過濾 \r 、\n 之類的行結束符,避免輸入的資料污染其它HTTP首部欄位,
參考文獻
https://www.jianshu.com/p/2f2e311e797b
https://blog.csdn.net/shakeyin1998/article/details/88411756
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71691.html
標籤:PHP
下一篇:PHP 創建GUID唯一標識
