Nginx中间件漏洞复现
Nginx中间件
1.介绍
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中 表现较好。
1.文件解析漏洞
1.漏洞描述
该漏洞是由于Nginx中php配置不当而造成的,与Nginx版本无关,但在高版本的php中,由于security.limit_extensions的引入,使得该漏洞难以被成功利用。在已经上传了恶意1.jpg文件后,访问/1.jpg/xxx.php,(路径修复cgi.fix_pathinfo=1后)使得Nginx将 其解析为php文件传给php-cgi程序(传给路径位于SERVER["SCRIPT_FILENAME"],修复去除路径位于 SERVER["PATH_INFO"]),但cgi程序将其解析为1.jpg并执行。
2.漏洞原理分析
Nginx的处理程序和FastCGI处理程序不同导致 Nginx拿到URI为/1.jpg/xxx.php后,识别处后缀是.php,认为是php文件,转交给PHP FastCGI处理程 序去处理。PHP FastCGI处理程序识别该URI:/1.jpg/xxx.php不存在,按照PHP FastCGI处理程序自己 的规则,删去最后的/xxx.php,又看/1.jpg存在,就将/1.jpg当成要执行的文件,就成功解析。Nginx传送给PHP FastCGI处理程序的路径可以在phpinfo中查看cgi.fix_pathinfo为php中的一个选项,默认开启为1,作用为修理路径,也就是对路径URI的处理规则
当php遇到文件路径为/1.jpg/xxx.php/ss.001时,该文件不存在,会删除最后的/ss.001,再判断/1.jpg/xxx.php是否存在,若存在则将/1.jpg/xxx.php当作/1.jpg/xxx.php/ss.001文件,若不存在,则继续删除最后一个路径。删除的多余路径会存在PATH_INFO中,在这里为ss.001
3.漏洞复现
使用phpstudy nginx php5.2.7
http://localhost/123.jpg/123.php
4.修复方案
1、 将php.ini文件中的cgi.fix_pathinfo的值设置为0,这样php再解析1.php/1.jpg这样的目录时,只要1.jpg 不存在就会显示404页面 2、 php-fpm.conf中的security.limit_extensions后面的值设置为.php
2.目录遍历漏洞
1.漏洞描述
Nginx的目录遍历与apache一样,属于配置方面的问题,错误的配置可导致目录遍历与源码泄露。
2.漏洞原理
修改nginx.conf,在如下图位置添加autoindex on
autoindex on;
autoindex on 开启目录浏览 autoindex off关闭目录浏览 默认是关闭状态
3.漏洞复现
1)在网站根目录下创建一个文件夹test
2)访问该文件夹
4.漏洞修复 1.设置 autoindex off 关闭目录浏览 2.删除 autoindex on
Mistake 2. 目录穿越漏洞
Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。
错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):
location /files {
alias /home/;
}
Payload: http://your-ip:8081/files../
,成功穿越到根目录:
Mistake 3. 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可被触发:
没复现成功
3.空字节代码执行漏洞
1.漏洞描述
在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可在非php文件中嵌入php代码,通过访问url+%00.php来执行其中的php代码。如:http://local/robots.txt.php会把robots.txt文件当作php来执行。影响版本:
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37
一般需要配合文件上传进行
2.漏洞复现
开启nginx
在网站目录下添加1.jpg文件
访问该文件
4)抓包,添加%00
这里由于该图非正常,在抓包时最后面添加..,可以让burpsuite抓到
将请求修改为:
/1.jpg..php
发包即可
3.漏洞修复
1.在nginx虚拟机配置或者fcgi.conf配置加如下代码:
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}
2.升级 nginx
参考:https://www.cnblogs.com/labster/p/14717805.html