Nginx 不安全配置导致的漏洞
前言:Nginx 不安全配置导致的漏洞知识点记录,然后扩充下hosts碰撞的利用以及相关的工具使用。
参考文章:https://www.freebuf.com/articles/web/149761.html
参考文章:https://joychou.org/web/nginx-http-forward-proxy-ssrf.html
参考文章:https://joychou.org/operations/nginx-config-security.html
参考文章:https://segmentfault.com/a/1190000015681272
参考文章:https://wya.pl/2022/06/16/virtual-hosting-a-well-forgotten-enumeration-technique/
nginx的配置
Ningx.conf配置一共分为4部分:1、顶级配置 2、Events 模块 3、http部分 4、Server部分
默认的nginx.conf配置如下:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main;#日志存储位置 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf;#配置文件目录 server { listen 80 default_server;#监听端口 listen [::]:80 default_server; server_name _;#域名 root /usr/share/nginx/html;#web目录存储的位置 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
不安全配置导致的任意文件读取/目录遍历
触发点:这个常见于Nginx做反向代理的情况,动态的部分被proxy_pass
传递给后端端口,而静态文件需要Nginx来处理。假设静态文件存储在/home/目录下,而该目录在url中名字为files,那么就需要用alias设置目录的别名
location /files { alias /home/; }
为/files
设置一个别名为/home/
,
访问:http://116.85.41.113/files../etc/passwd
,发现成功读取!
这里相当于/home/../etc/passwd
,如果/files
为/files/
那么肯定就是正常解析,但是这里没有闭合导致了任意文件读取
alias的目录遍历:只能跳到上一层目录,读取上一层目录及其任意子目录的文件,不能任意目录遍历读取任意文件,有局限性!
修复方法:结尾都带上/
字符!
如果当前目录是可遍历的,也就是再加上
autoindex on;
$uri导致的CRLF注入
触发点:在实际业务场景中经常需要在nginx中配置路径跳转。比如用户访问http://x.com
需要自动跳转到https://x.com
或者是访问http://x.com
自动跳转到http://www.x.com
实现条件:
1、需要进行302跳转
2、还需要知道用户请求的路径内容
这里有有三个可以表示URI的变量:
$uri $document_uri $request_uri
$uri
和$document_uri
表示的是解码以后的请求路径,并且不带参数
而$request_uri表示的是完整的URI,带参数,并且没有解码过
如果在nginx.conf中配置了下列的代码:
location /test { return 302 http://$host:443$uri; }
这里$host为请求域,$uri为请求路径,这里知道$uri会进行解码,那么当我们进行注入%0d%0a
的时候,就会触发CRLF漏洞
注意:该漏洞除了发生在return的后面,也可能发生在rewrite、add_header、proxy_set_header、proxy_pass的后门
修复方式:将$uri/$document_uri都改为$request_uri
proxy_pass反向代理导致的SSRF
触发点:SSRF(服务端请求伪造)漏洞常出现在反向代理的配置中,反向代理的语法如下:proxy_pass http://ip:port/uri/;
不安全配置如下:
location ~ /([a-zA-Z0-9.:%]+) { proxy_pass http://$1; }
如果攻击者可以操控IP, 将其修改成内网IP地址即可造成SSRF漏洞。
请求成功为:
请求失败为:
最大的特点:无回显!
proxy_pass正向代理导致的SSRF
不安全配置如下:
proxy_pass http://$host$request_uri;
最大的特点:有回显!
default_server配置不当(2021.5.09更新)
nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server
在了解到如上规则后,我们可以捕获未做绑定的域名访问或直接IP访问,做重定向到 403 页面等处理
环境配置如下:
此时的default_server为第一个server块,那么造成的结果就是如果用IP直接访问则回显403页面,如下所示
这时候配置了第二个server块:
如果Host字段为www.ttttt.com的话,那么nginx则会以第二个server来处理这个请求,那么请求的目录则为/usr/share/nginx/html中,如下所示
可能到这里还是不会太懂这个东西在挖掘漏洞的时候有什么关系?继续往下走
来,继续模拟,如下所示:
此时去重新配置我们的nginx服务器的配置文件
先回顾下请求一个域名的流程是怎么样的?首先看本机缓存,再看HOSTS记录,如果都没有则请求本地DNS服务器,本地DNS服务器中没有,则本地DNS服务器迭代去请求根DNS服务器,上面的图中在本机的HOSTS写上两个模拟的地址,因为条件有限啊,模拟不了DNS服务器,所以这里就模拟HOSTS作为DNS服务器
挖掘zpchcbd.com的域名的漏洞,发现收集的域名其中DNS解析的一个IP为192.168.4.136(假设外网IP),直接访问192.168.4.136却是回显为403拒绝访问的界面
这时候就可以通过该ip来匹配不同的host字段来进行访问,比如访问hosts字段头为admin.zpchcbd.com
那要如何进行利用?
r3start提供了一个自定义hosts头来进行访问的脚本:https://github.com/fofapro/Hosts_scan
总结下:
1、内网的管理系统和业务系统都用同一台nginx服务器进行反向代理
2、扫外网的时候扫到解析ip为内网的域名(如何大量的搜集内部的域名才是最重要的)
3、通过hosts碰撞,来遍历域名绑定外网的这个Nginx的ip,如果正好如何这个nginx的配置项的server_name则hosts碰撞成功!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY