文章总结: 本文解析Nginx因uri解码导致的CRLF注入漏洞。通过错误配置的重定向参数注入回车换行符,攻击者可控制HTTP响应头,实现恶意Cookie注入或反射型XSS。文章还展示了注入特定响应头绕过XSSFilter及利用字符编码增强攻击效果的方法。 综合评分: 92 文章分类: 漏洞分析,WEB安全
Nginx CRLF注入漏洞解析
原创
晨星安全团队
晨星安全团队
2026年1月13日 16:29 江苏
Nginx CRLF 注入
漏洞基础信息
核心定义
CRLF 是”回车 + 换行”(\r\n)的简称
CRLF Injection 又叫 HTTP Response Splitting,简称 HRS
HTTP 协议相关规则
HTTP 协议中,HTTP Header 与 HTTP Body 是用两个 CRLF 分隔的,浏览器就是根据这两个 CRLF 来取出HTTP 内容并显示出来
所以,一旦我们能够控制 HTTP 消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话 Cookie 或 者 HTML代码
Nginx 漏洞成因
Nginx 关键特性
Nginx 会将 $uri 进行解码,导致传入 %0d%0a 即可引入换行符,造成 CRLF 注入漏洞
错误配置文件示例
原本的目的是为了让 HTTP 的请求跳转到 HTTPS 上
// / 表示匹配所有请求路径
// $host 是客户端请求中的主机名(例如 example.com)
// $uri 是请求的 URI 路径部分,不含查询字符串(例如 /index.html)
location / {
return 302 https://$host$uri;
}
漏洞利用方式
注入恶意 Cookie
利用这个漏洞可注入 Set-Cookie 头
http://your-ip:8080/%0d%0aSet-Cookie:%20a=1
反射型 XSS 攻击
当然,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 onerror=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/)>
之前说了浏览器会根据第一个 CRLF 把 HTTP 包分成头和体,然后将体显示出来
于是我们这里<img>这个标签就会显示出来,造成一个 XSS
新浪某分站含有一个 URL 跳转漏洞,危害并不大,于是我就想到了CRLF Injection,当我测试
XSS 时看控制台,果然被 XSS Filter 拦截了
那么我们就注入一个 X-XSS-Protection:0 到数据包中,看看什么效果
还想到了一个利用字符编码来绕过 XSS Filter 的方法,当编码是 is-2022-kr 时浏览器会忽略%0f,这样我们在onerror后面加个%0f就能绕过 filter,前提是注入一个<meta charset=ISO-2022-KR>
-END-
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:晨星安全团队 晨星安全团队《Nginx CRLF注入漏洞解析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论