概念

CRLF注入漏洞,是因为Web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。攻击者一旦向请求行或首部中的字段注入恶意的CRLF,就能注入一些首部字段或报文主体,并在响应中输出,所以又称为HTTP响应拆分漏洞(HTTP Response Splitting),简称HRS。

漏洞出现场景

PHP CRLF

PHP版本需要在4.2.1~5.1.2之间 CVE-2002-1783

NGINX错误配置模拟复现

nginx配置

server {
    listen 8080;
    root /usr/share/nginx/html;
    index index.html;
    server_name _;
    location /crlf {
        return 302 https://$host$uri;
    }
}

nginx和php是用Location: http://baidu.com这种方式来进行302跳转,所以我们能控制的内容就是Location:后面的XXX某个网址,通过Set-Cookie我们就给访问者设置了一个固定SESSION,如果某应用刚好可以受这个参数控制,那将会有重大影响,否则,该漏洞的危害比较小。。当然,HRS并不仅限于会话固定,通过注入两个CRLF就能造成一个无视浏览器Filter的反射型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: http://www.sina.com.cn
Set-cookie: JSPSESSID=wooyu

python和nodejs实际上都是修改请求头,似乎对渗透没什么用

Python urllib CRLF

Python的crlf实际是上用来修改请求头
Python 2.x版本至2.7.16版本中的urllib2
Python 3.x版本至3.7.2版本中的urllib

Nodejs CRLF

nodejs的crlf实际上也是修改请求头
2018 年有研究者发现,当Node.js使用 http.get 向特定路径发出HTTP请求时,发出的请求实际上被定向到了不一样的路径!深入研究一下,发现这个问题是由Node.js将HTTP请求写入路径时,对Unicode字符的有损编码引起的。当结果字符串被编码为 latin1 写入路径时,这些字符将分别被截断为 “\r”(%0d)和 “\n”(%0a):

Buffer.from('http://47.101.57.72:4000/\u{010D}\u{010A}/WHOAMI', 'latin1').toString()
'http://47.101.57.72:4000/\r\n/WHOAMI'

这个bug已经在Node.js10中被修复,如果请求路径包含非Ascii字符,则会抛出错误。但是对于 Node.js v8 或更低版本,仍然存在该问题

  • 检测url:http://x.x.x.x:8080/\u0120HTTP/1.1\u010D\u010ASet-Cookie:\u0120PHPSESSID=whoami\u010D\u010Atest:

参考资料

https://blog.csdn.net/u014029...
https://blog.csdn.net/weixin_...
https://blog.csdn.net/huangyo...
https://cloud.tencent.com/dev...
https://blog.csdn.net/rpsate/...
https://blog.csdn.net/weixin_...


白风之下
10 声望3 粉丝