V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
FONG2
V2EX  ›  NGINX

nginx 反代 tomcat 后, url 带斜杠出现源码下载漏洞

  •  
  •   FONG2 · 2022-02-08 15:42:36 +08:00 via iPhone · 6013 次点击
    这是一个创建于 779 天前的主题,其中的信息可能已经有所发展或是发生改变。

    百度搜了一遍,tomcat 有类似的漏洞,但是我的版本已经修复。 实测直接访问 tomcat 地址 xxx.jsp/报 404 , 访问 nginx 地址 xxx.jsp/弹出下载请求,能把这个 jsp 源码下回来, 怎么破? 百度没找到相应漏洞说明, 我尝试用 rewire 屏蔽后斜杠,但是导致 xxx.com/aa/打不开了。

    第 1 条附言  ·  2022-02-08 16:31:34 +08:00
    追加内容 5 ,8 ,9 ,11 楼
    44 条回复    2022-02-11 01:01:24 +08:00
    learningman
        1
    learningman  
       2022-02-08 15:44:36 +08:00
    把你 nginx 配置发出来吧
    themostlazyman
        2
    themostlazyman  
       2022-02-08 15:44:39 +08:00
    贴下 nginx 配置吧,感觉没配置对。
    julyclyde
        3
    julyclyde  
       2022-02-08 15:48:27 +08:00   ❤️ 1
    你确定是反代?是不是 nginx 直接 root 到同一个目录去了?
    undeflife
        4
    undeflife  
       2022-02-08 15:50:36 +08:00
    看起来是直接把 root 设置到了 tomcat 的 webapps 目录
    FONG2
        5
    FONG2  
    OP
       2022-02-08 16:02:17 +08:00
    location /abc {
    proxy_set_header CLIENTIP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://1.1.1.1:8080/abc;
    }
    FONG2
        6
    FONG2  
    OP
       2022-02-08 16:03:37 +08:00
    learningman
        7
    learningman  
       2022-02-08 16:05:12 +08:00
    不是这里,问题可能处在上面的 root 那里
    FONG2
        8
    FONG2  
    OP
       2022-02-08 16:06:43 +08:00
    访问 nginx http://host/abc/a.jsp/ 弹下载提示 能下载源码
    访问 tomcat http://host:8080/abc/a.jsp/ 显示 404
    nginx 版本 1.21.6
    tomcat 8.5.63
    FONG2
        9
    FONG2  
    OP
       2022-02-08 16:10:35 +08:00
    @learningman 这个 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 http://1.1.1.1:8080/abc/;
    }
    ThirdFlame
        10
    ThirdFlame  
       2022-02-08 16:24:42 +08:00
    能下到 a.jsp 的源代码? 你确实不是 html 而是源代码?
    FONG2
        11
    FONG2  
    OP
       2022-02-08 16:28:47 +08:00 via iPhone
    @ThirdFlame yes
    <%@ page...
    <% request.setxxxxx%>
    都能看到,就是 jsp 源码
    skiy
        12
    skiy  
       2022-02-08 16:48:25 +08:00
    在服务器直接 curl 一下看看是 404 ,还是下载?按理不应该出现这个问题才对。

    我有个配置

    index index.html index.htm default.htm default.html;
    root /data/wwwroot/default;

    location / {
    log_not_found on;
    proxy_pass http://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;
    }
    FONG2
        13
    FONG2  
    OP
       2022-02-08 17:07:35 +08:00 via iPhone
    @skiy curl 是下载 也可以看到<%代码%>
    eason1874
        14
    eason1874  
       2022-02-08 17:18:25 +08:00
    a.jsp 是文件名?如果是,这种情况应该是 Nginx 没把 a.jsp/ 请求转发给 Tomcat 处理,而是当作文件下载请求返回文件内容
    FONG2
        15
    FONG2  
    OP
       2022-02-08 17:22:31 +08:00 via iPhone
    @eason1874 那怎么解决?而且我在 access.log localhost_xxlog 查不到访问记录
    qq1340691923
        16
    qq1340691923  
       2022-02-08 17:26:04 +08:00
    jsp 而已,有什么慌的
    skiy
        17
    skiy  
       2022-02-08 17:41:08 +08:00
    @FONG2 若在你服务器中 CURL 实际地址也是下载,那就不是 NGINX 的问题了吧。若是只有反代的地址是下载,才是 NGINX 的问题。反代没涉及到下载的,是不是你 NGINX 的配置问题?可以试试的上面发的那串(需要重启 NGINX )
    eason1874
        18
    eason1874  
       2022-02-08 17:48:24 +08:00
    @FONG2 让后端给请求打日志,然后访问了看日志就知道请求有没有到后端了。请求没有到后端就是反代配置问题
    Chism
        19
    Chism  
       2022-02-08 17:50:14 +08:00
    我的 nginx 把版本从 1.21 换到 1.19 ,竟然导致 domain 前端调用 domain/的 api 报跨域
    gengchun
        20
    gengchun  
       2022-02-08 18:36:41 +08:00
    见过太多离谱的部署了,不评价 OP 。

    @Chism 确认一下 ngx 编译参数,可能是配置路径问题导致用了不正确的配置。
    keepeye
        21
    keepeye  
       2022-02-08 18:43:37 +08:00
    location / {
    return 403;
    }

    测一下有没有走到里面
    adoal
        22
    adoal  
       2022-02-08 18:49:12 +08:00
    nginx 没配 root 也有个默认 root 的,也许就是跟 tomcat 一起了呢
    jptx
        23
    jptx  
       2022-02-08 18:51:58 +08:00
    强烈怀疑问题出在 Tomcat 及应用里,可能某个配置导致 Tomcat 直接按普通资源文件来处理 jsp 文件了,并没有走 jsp 的解析逻辑
    lower
        24
    lower  
       2022-02-08 20:08:00 +08:00
    你 tomcat 里面跑了多少项目啊?反代到 tomcat 根路径就好,简简单单的最不容易出问题,否则相对路径映射来映射去的就会出莫名其妙的问题
    项目多就跑多个 tomcat 进程,用端口来区分明明白白的
    zanelee
        25
    zanelee  
       2022-02-08 21:02:02 +08:00
    为什么要 location /abc {};然后再 http://1.1.1.1:8080/abc;
    直接这样不行吗?那个 abc
    location ^~ /abc {
    ...
    proxy_pass http://1.1.1.1:8080;
    }
    FONG2
        26
    FONG2  
    OP
       2022-02-08 21:45:35 +08:00 via iPhone
    @skiy curl ng 地址是下载 curl tomcat 地址是 404
    FONG2
        27
    FONG2  
    OP
       2022-02-08 21:46:27 +08:00 via iPhone
    @jptx 直接访问 tomcat 地址没有问题呢 a.jsp/报 404
    FONG2
        28
    FONG2  
    OP
       2022-02-08 21:49:08 +08:00 via iPhone
    @zanelee
    @lower tomcat 就一个应用,abc.war
    tomcat 访问地址就是 1.1.1.1:8080/abc
    FONG2
        29
    FONG2  
    OP
       2022-02-08 21:51:07 +08:00 via iPhone
    @adoal 那我明天配个 root 看看
    FONG2
        30
    FONG2  
    OP
       2022-02-08 22:01:14 +08:00
    @eason1874 怎么打日志?访问 nginx 地址 http://host/abc/a.jsp/ 弹下载提示 是否下载 a.jsp_ 保存后就是 a.jsp 源码,名字多了个下划线
    nginx 的日志 access.log tomcat 的日志 localhost_access_xx.txt 都没有日志记录
    要在 jsp 里面用 java 代码输出 System.out.print? 我估计也不会打日志
    oneisall8955
        31
    oneisall8955  
       2022-02-08 22:37:53 +08:00 via Android
    先 curl 到 1.1.1.1:8080/abc/a.jsp/ 看是 404 还是下载源码。如果 404 ,tomcat 不背这个锅。下载源码的话,nginx 配置错了,上层 root 静态资源配置到 tomcat 去了?
    FONG2
        32
    FONG2  
    OP
       2022-02-08 23:27:24 +08:00 via iPhone
    @oneisall8955 先 curl 到 1.1.1.1:8080/abc/a.jsp/ 这个是 404
    nginx Server 没配 root 地址,准备明天配一个看看
    GuuJiang
        33
    GuuJiang  
       2022-02-09 00:08:37 +08:00 via iPhone
    最简单的排查方法,让 tomcat 和 nginx 跑在不同的机器上,如果不能复现,说明就是 nginx 把 jsp 当成静态资源了,与反代无关
    skiy
        34
    skiy  
       2022-02-09 00:16:06 +08:00 via iPhone
    @FONG2 看我 12 楼的例子。这是我能跑的反代。另外,我记得 root 好像要必配的。你配置好时,有尝试 nginx -t 了没?有 reload 或者 restart nginx 了没?

    感觉你配置得有问题。
    xiaoDevil
        35
    xiaoDevil  
       2022-02-09 00:29:31 +08:00
    @FONG2 可以试试把 tomcat 关了,请求 nginx/a.jsp/ 看看能不能下载, 还能下载就说明不是 tomcat 的事,nginx 配置的有问题,然后再依次检查 nginx 的配置
    ipwx
        36
    ipwx  
       2022-02-09 00:33:18 +08:00   ❤️ 1
    35L 的方法好,先把 tomcat 关了看能不能访问 .jsp 的代码
    Beebird
        37
    Beebird  
       2022-02-09 01:05:24 +08:00
    赞同 25 楼说的,http://1.1.1.1:8080/abc 这样不对,可能会导致 uri (/abc/a.jsp) append 到 /abc 后面
    lolizeppelin
        38
    lolizeppelin  
       2022-02-09 10:53:47 +08:00
    nginx rpm 版的默认 root 是 /usr/share/nginx
    elevioux
        39
    elevioux  
       2022-02-09 12:06:58 +08:00   ❤️ 1
    很可能只是配置错了,nginx 根本没有把请求给到后端,直接当作静态文件给下载了
    lupohan44
        40
    lupohan44  
       2022-02-09 13:36:07 +08:00
    @FONG2 #26 清除浏览器缓存试试?
    encro
        41
    encro  
       2022-02-09 13:52:36 +08:00
    能下载源码,就是因为 nginx 规则没有匹配上,走了其他规则了,应该是你的 root 设置错了,将 root 设置到 public 目录上试试。
    encro
        42
    encro  
       2022-02-09 13:57:07 +08:00
    nginx 配置好后重启(-s reload )前,
    需要 -t 测试一遍,
    否则会走上次成功的配置!!!
    FONG2
        43
    FONG2  
    OP
       2022-02-10 16:14:19 +08:00 via iPhone
    @xiaoDevil
    @ipwx
    @lolizeppelin
    @elevioux
    @encro
    最新发现,关了 tomcat 还能下载!页面访问不了,后面加斜杠还是可以下载!
    root 加上了,nginx 重启过了
    无效…
    ipwx
        44
    ipwx  
       2022-02-11 01:01:24 +08:00
    换个 http 服务器比如 caddy 如何
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1543 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 17:03 · PVG 01:03 · LAX 10:03 · JFK 13:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.