中间件安全之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
参考: