nginx 反代 tomcat 后, url 带斜杠出现源码下载漏洞
百度搜了一遍,tomcat 有类似的漏洞,但是我的版本已经修复。
实测直接访问 tomcat 地址 xxx.jsp/报 404 ,
访问 nginx 地址 xxx.jsp/弹出下载请求,能把这个 jsp 源码下回来,
怎么破?
百度没找到相应漏洞说明,
我尝试用 rewire 屏蔽后斜杠,但是导致 xxx.com/aa/打不开了。
追加内容 5 ,8 ,9 ,11 楼
把你 nginx 配置发出来吧
贴下 nginx 配置吧,感觉没配置对。
你确定是反代?是不是 nginx 直接 root 到同一个目录去了?
看起来是直接把 root 设置到了 tomcat 的 webapps 目录
location /abc {
proxy_set_header CLIENTIP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass 1.1.1.1:8080/abc;
}
不是这里,问题可能处在上面的 root 那里
访问 nginx host/abc/a.jsp/ 弹下载提示 能下载源码
访问 tomcat host:8080/abc/a.jsp/ 显示 404
nginx 版本 1.21.6
tomcat 8.5.63
这个 Server 没有配 root
server {
listen 80;
server_name localhost;
client_body_timeout 60s;
client_header_timeout 60s;
send_timeout 600s;
location / {
proxy_set_header MyClientIP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass 1.1.1.1:8080/abc/;
}
能下到 a.jsp 的源代码? 你确实不是 html 而是源代码?
yes
<%@ page...
<% request.setxxxxx%>
都能看到,就是 jsp 源码
在服务器直接 curl 一下看看是 404 ,还是下载?按理不应该出现这个问题才对。
我有个配置
index index.html index.htm default.htm default.html;
root /data/wwwroot/default;
location / {
log_not_found on;
proxy_pass 127.0.0.1:8081/api/;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
curl 是下载 也可以看到<%代码%>
a.jsp 是文件名?如果是,这种情况应该是 Nginx 没把 a.jsp/ 请求转发给 Tomcat 处理,而是当作文件下载请求返回文件内容
那怎么解决?而且我在 access.log localhost_xxlog 查不到访问记录
jsp 而已,有什么慌的
若在你服务器中 CURL 实际地址也是下载,那就不是 NGINX 的问题了吧。若是只有反代的地址是下载,才是 NGINX 的问题。反代没涉及到下载的,是不是你 NGINX 的配置问题?可以试试的上面发的那串(需要重启 NGINX )
让后端给请求打日志,然后访问了看日志就知道请求有没有到后端了。请求没有到后端就是反代配置问题
我的 nginx 把版本从 1.21 换到 1.19 ,竟然导致 domain 前端调用 domain/的 api 报跨域
见过太多离谱的部署了,不评价 OP 。
确认一下 ngx 编译参数,可能是配置路径问题导致用了不正确的配置。
location / {
return 403;
}
测一下有没有走到里面
nginx 没配 root 也有个默认 root 的,也许就是跟 tomcat 一起了呢
强烈怀疑问题出在 Tomcat 及应用里,可能某个配置导致 Tomcat 直接按普通资源文件来处理 jsp 文件了,并没有走 jsp 的解析逻辑
你 tomcat 里面跑了多少项目啊?反代到 tomcat 根路径就好,简简单单的最不容易出问题,否则相对路径映射来映射去的就会出莫名其妙的问题
项目多就跑多个 tomcat 进程,用端口来区分明明白白的
为什么要 location /abc {};然后再 1.1.1.1:8080/abc;
直接这样不行吗?那个 abc
location ^~ /abc {
...
proxy_pass 1.1.1.1:8080;
}
curl ng 地址是下载 curl tomcat 地址是 404
直接访问 tomcat 地址没有问题呢 a.jsp/报 404
tomcat 就一个应用,abc.war
tomcat 访问地址就是 1.1.1.1:8080/abc
那我明天配个 root 看看
怎么打日志?访问 nginx 地址 host/abc/a.jsp/ 弹下载提示 是否下载 a.jsp_ 保存后就是 a.jsp 源码,名字多了个下划线
nginx 的日志 access.log tomcat 的日志 localhost_access_xx.txt 都没有日志记录
要在 jsp 里面用 java 代码输出 System.out.print? 我估计也不会打日志
先 curl 到 1.1.1.1:8080/abc/a.jsp/ 看是 404 还是下载源码。如果 404 ,tomcat 不背这个锅。下载源码的话,nginx 配置错了,上层 root 静态资源配置到 tomcat 去了?
先 curl 到 1.1.1.1:8080/abc/a.jsp/ 这个是 404
nginx Server 没配 root 地址,准备明天配一个看看
最简单的排查方法,让 tomcat 和 nginx 跑在不同的机器上,如果不能复现,说明就是 nginx 把 jsp 当成静态资源了,与反代无关
看我 12 楼的例子。这是我能跑的反代。另外,我记得 root 好像要必配的。你配置好时,有尝试 nginx -t 了没?有 reload 或者 restart nginx 了没?
感觉你配置得有问题。
可以试试把 tomcat 关了,请求 nginx/a.jsp/ 看看能不能下载, 还能下载就说明不是 tomcat 的事,nginx 配置的有问题,然后再依次检查 nginx 的配置
35L 的方法好,先把 tomcat 关了看能不能访问 .jsp 的代码
赞同 25 楼说的, 1.1.1.1:8080/abc 这样不对,可能会导致 uri (/abc/a.jsp) append 到 /abc 后面
nginx rpm 版的默认 root 是 /usr/share/nginx
很可能只是配置错了,nginx 根本没有把请求给到后端,直接当作静态文件给下载了
#26 清除浏览器缓存试试?
能下载源码,就是因为 nginx 规则没有匹配上,走了其他规则了,应该是你的 root 设置错了,将 root 设置到 public 目录上试试。
nginx 配置好后重启(-s reload )前,
需要 -t 测试一遍,
否则会走上次成功的配置!!!
三年前买的红米 K30pro ,还是很流畅,但当时买的 128G 空间太小了。现在已经完全不够用了。打算换一个 2500 左右的,突然发现了这款末代机皇,主要是有 s pen …
Bash 是Linux操作系统的默认Shell脚本。Shell是用来处理操作系统和用户交互的一个程序。Shell的脚本可以帮助用户自动化地和操作系统进行交互。你也可以理解为一种…
在 github 上看到了中国程序员容易发音错误的单词 感觉挺好玩的,就写了个iOS 版 欢迎大家下载体验 有评论和评分就更好了。。 git -> [寄特] 笑死。。 还…