CRLF注入漏洞(反弹型XSS)

CRLF 注入漏洞

参考:https://blog.csdn.net/weixin_44431280/article/details/122869484

CRLF 简介

CRLF 指的就是回车符(CR,ASCII-13,\r%0d)和换行符(LF,ASCII-10,\n%0a

%0d%0a

操作系统就是通过这个标识进行换行的,相当于我们键盘的回车键。

HTTP协议中的CRLF

在HTTP协议报文中,请求行与请求头通过一个CRLF(\r\n)隔开,请求头(header)和请求正文(body)之间通过两个CRLF(\r\n)隔开,如下图:

image-20220811170742129

所以,一旦我们通过URL能够控制HTTP 消息头(请求行)中的字符,注入一些恶意的换行,这样我们就能构造恶意的请求行或请求正文,注入一些会话Cookie或者HTML代码。所以CRLF Injection又称为HTTP响应拆分漏洞HTTP Response Splitting,简称HRS。

利用

Cookie会话固定

在URL参数中构造%0d%0aSet-Cookie:crlf=ture

image-20220811171140761

查看HTTP响应包,可以发现HTTP响应头存在了Set-Cookie:crlf=true。因为加入了一个CRLF,所以URL中的一部分内容被作为请求头解析,而$_GET变量接受的URL会直接作为响应头中的Location字段返回。

image-20220811171158328

反射型XSS攻击

如果此时我们在URL中加入%0d%0aSet-Cookie:%20de=a%0d%0a%0d%0a<script>alert('xss')</script>,那么服务端返回界面将会如下图:

image-20220811172139448

因为添加了两个CRLF的情况,JS脚本会被识别为HTTP响应正文被浏览器执行,那么就会产生反射性XSS攻击.

CRLF注入漏洞防护建议

  • 服务端前增加WAF进行防护

  • 对用户的数据进行合法性校验,对特殊的字符进行编码,如 <、>、’、”、CR、LF 等,限制用户输入的 CR 和 LF,或者对 CR 和 LF 字符正确编码后再输出,以防止注入自定义 HTTP 头避免输入的数据污染其他 HTTP 首部字段。