Nginx简介
Nginx可以部署在网络上使用FastCGI脚本、SCGI处理程序、WSGI应用服务器或Phusion Passenger模块的动态HTTP内容,并可作为软件负载均衡器
由于Nginx免费开源,并且在稳定性方面做得比较好,所以目前大部分Web服务器使用Nginx,所以我就把Nginx常见的漏洞再做一次复现与整理。
Nginx常见漏洞:
Nginx 配置错误导致漏洞:
影响版本:与版本无关只和配置有关。
解析漏洞
漏洞配置:配置nginx下的*.conf
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;
}
}
1、当我们输入test.png/xx.php 的时候nginx看到.php结尾的话会传给php fastcgi处理 -->
2、php根据url映射寻找xx.php,发现不存在 -->
3、由于cgi.fix_pathinfo是开启的,所以php会继续在路径中寻找文件,之后找到test.png以php形式来处理,至于/xx.php会被存储到PATH_INFO后丢弃。
1.上传一个名为1.png的图片,图片中带有phpinfo(),可以看到response返回了图片地址。
2.访问图片地址,加上/xx.php
CRLF注入
查看nginx的文档,表示uri的有三个参数。
其中$uri和$document_uri表示URL解码后的请求路径;$request_uri不解码。
于是当传入%0a%0d的时候nginx会将$url和$document_uri进行解码,引入换行符,造成CRLF注入漏洞
错误配置:(nginx.conf)
server {
location / {
return 302 https://$host$uri; #原本目的:让http请求跳转到https上。
}
}
利用过程:
1.设置:burp拦截response包,当request被拦截的时候,也拦截response。
2.访问payload
#payload:
http://192.168.11.11:8080/%0aX-XSS-Protection:%200%0a%0d%0a%0d%3Cimg%20src=1%20onerror=alert(/xss/)%3E
2.1 修改response包的Location端口号<80
成功弹出xss:
2.2 使用CSP禁止iframe的跳转
具体参考:P牛的文章。
目录穿越
错误配置:
#在给nginx配置别名的时候/files映射到了/home/,那么如果在files加上../就相当于:/home/../于是就到了上一层目录
location /files {
alias /home/;
}
利用过程:
修复方案:
location /files/ {
alias /home/;
}
add_header被覆盖
错误配置:
# 在添加add_header的时候覆盖了父块HTTP头
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;
}
利用过程:
test1使用默认头
test2添加X-Content-Type-Options头,导致add_header失效
文件名逻辑漏洞(CVE-2013-4547)
影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
漏洞配置:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
由于空格的原因,让nginx错误的解析文件名,传递给fastcgi解析成php。是一个URI解析错误和错误获取文件名导致的漏洞
复现过程:
上传一个带有文件名带有空格的phpinfo.jpg
上传成功,返回地址
更改文件名
把..改为20 00成功解析phpinfo
越界读取缓存漏洞(CVE-2017-7529)
影响版本:Nginx 0.5.6 - 1.13.2
POC:CVE-2017-7529
结果读取到缓存头文件,HTTP返回包等信息
参考:(更多具体参考)
空字节任意代码执行漏洞
影响版本:nginx <=0.8.37
在Fast-CGI关闭的状态下,文件路径 /xxx.jpg%00.php 会解析成PHP文件
尾巴:
在复现nginx的过程中,不光光是复现这个漏洞这么简单,在复现的时候搭建环境的过程中,也更加对nginx一些配置有更深入的了解,整体来说这段时间收获还是蛮多的。(加油!)
声明:
笔者初衷用于分享与交流网络知识,若读者因此作出任何危害网络安全行为后果自负,与作者无关!
本文属于@ayoung博客,未经许可禁止转载: