中间件安全之Nginx渗透
一、概述
目录结构

默认情况下,网站主目录是在该文件下的html文件中,但是这里使用小皮进行搭建,根目录重新设置了,可以在\nginx\conf\nginx.conf文件中查看


版本查看
Linux下

二、Nginx漏洞分析及复现
1、文件解析漏洞
文件上传,绕过
0x01 概述
该漏洞是由于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并执行。
0x02 环境搭建
使用Win7和phpstudy进行搭建复现环境,下载安装即可,切换版本为

// Nginx版本
C:\phpStudy\PHPTutorial\nginx>nginx -v
nginx version: nginx/1.11.5
IP为192.168.112.139
0x03 复现操作
1)创建1.jpg文件
<?php
phpinfo();
?>
2)网站访问该文件
http://192.168.112.139/1.jpg

3)修改访问URI
http://192.168.112.139/1.jpg/xxx.php

成功解析
0x04 漏洞原理分析
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

0x05 参考
备注:高版本的情况还没复现,高版本PHP提供
security.limit_extensions参数,不允许将jpg文件当作php解析IIS在这一点和Nginx是一样的,同样存在这一问题
2、目录遍历漏洞
0x01 概述
也是类似解析漏洞,是nginx配置问题导致的
0x02 环境搭建
同文件解析漏洞环境
0x03 复现操作
1)在网站根目录下创建一个文件夹test
2)访问该文件夹
回显403

3)修改nginx.conf配置文件,访问即可
将autoindex off改为autoindex on

0x04 参考
https://www.cnblogs.com/yuzly/p/11208842.html
3、空字节代码执行漏洞
0x01 概述
在使用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
一般需要配合文件上传进行
0x02 复现操作
复现环境信息:
ip:192.168.112.140
Nginx:0.7.65
php:5.3.2
1)开启Nginx

2)在网站目录下添加1.jpg文件

3)访问该文件

4)抓包,添加%00
这里由于该图非正常,在抓包时最后面添加..,可以让burpsuite抓到

将请求修改为:
/1.jpg..php

5)发包即可

4、CRLF注入漏洞
0x01 概述
漏洞成因:Nginx将传入的url进行解码,对其中的%0a%0d替换成换行符,导致后面的数据注入至头部,造成CRLF注入漏洞。
环境:
Nginx
php5.2.17
0x02 复现操作
1)设置
设置https跳转,这样就可以接收到url,进而进行处理。在C:\phpStudy\PHPTutorial\nginx\conf\nginx.conf文件中添加下面一行话。
location / {
return 302 https://$host$uri;
}

2)构造url,访问
http://192.168.1121.140/%0ASet-cookie:JSPSESSID%3D3
抓包发送

3)恶意利用
%0D%0A%0D%0A%3cscript%3ealert(123)%3c%2fscript%3e

不过这里没有弹窗成功,有相关函数进行了过滤
参考:
https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html
https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html
5、文件名逻辑漏洞(CVE-2013-4547)
绕过访问限制(目录跨越)、代码执行
0x01 概述
这一漏洞的原理是非法字符空格和截止符(\0)会导致Nginx解析URI时的有限状态机混乱,此漏洞可导致目录跨越及代码执行,其影响版本为:nginx 0.8.41 – 1.5.6
环境:
此次实验在vulhub中复现
0x02 复现操作
1)创建1.jpg 文件,并上传
抓包,在该文件最后添加一个空格

可以看到上传成功

2)访问该文件,burpbuite抓包处理
访问URL:http://192.168.112.111/1.jpg...php
在burp的hex页面中将第一个点.改成20,第二个改为00

发送即可

参考:
CVE-2013-4547 Nginx解析漏洞深入利用及分析_91Ri.org
14.Nginx 文件名逻辑漏洞(CVE-2013-4547) - bmjoker - 博客园 (cnblogs.com)
0x03 解析漏洞小结
这篇文章中介绍了三个解析漏洞
文件解析漏洞 配置问题
%00解析漏洞 nginx 0.5、0.6、<0.7.65、<0.8.37
空格和截止符解析漏洞 nginx 0.8.41 – 1.5.6
参考:文件解析漏洞总结-Nginx | 若水斋 (werner.wiki)
6、整数溢出漏洞(CVE-2017-7529)
0x01 概述
在 Nginx 的 range filter 中存在整数溢出漏洞,可以通过带有特殊构造的 range 的 HTTP 头的恶意请求引发这个整数溢出漏洞,并导致信息泄露。
影响程度:
攻击成本:低
危害程度:低
影响范围:Nginx 0.5.6 – 1.13.2
参考:

浙公网安备 33010602011771号