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 · 238 天前 via iPhone · 5359 次点击
    这是一个创建于 238 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  238 天前
    追加内容 5 ,8 ,9 ,11 楼
    44 条回复    2022-02-11 01:01:24 +08:00
    learningman
        1
    learningman  
       238 天前
    把你 nginx 配置发出来吧
    themostlazyman
        2
    themostlazyman  
       238 天前
    贴下 nginx 配置吧,感觉没配置对。
    julyclyde
        3
    julyclyde  
       238 天前   ❤️ 1
    你确定是反代?是不是 nginx 直接 root 到同一个目录去了?
    undeflife
        4
    undeflife  
       238 天前
    看起来是直接把 root 设置到了 tomcat 的 webapps 目录
    FONG2
        5
    FONG2  
    OP
       238 天前
    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
       238 天前
    learningman
        7
    learningman  
       238 天前
    不是这里,问题可能处在上面的 root 那里
    FONG2
        8
    FONG2  
    OP
       238 天前
    访问 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
       238 天前
    @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  
       238 天前
    能下到 a.jsp 的源代码? 你确实不是 html 而是源代码?
    FONG2
        11
    FONG2  
    OP
       238 天前 via iPhone
    @ThirdFlame yes
    <%@ page...
    <% request.setxxxxx%>
    都能看到,就是 jsp 源码
    skiy
        12
    skiy  
       238 天前
    在服务器直接 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
       238 天前 via iPhone
    @skiy curl 是下载 也可以看到<%代码%>
    eason1874
        14
    eason1874  
       238 天前
    a.jsp 是文件名?如果是,这种情况应该是 Nginx 没把 a.jsp/ 请求转发给 Tomcat 处理,而是当作文件下载请求返回文件内容
    FONG2
        15
    FONG2  
    OP
       238 天前 via iPhone
    @eason1874 那怎么解决?而且我在 access.log localhost_xxlog 查不到访问记录
    qq1340691923
        16
    qq1340691923  
       238 天前
    jsp 而已,有什么慌的
    skiy
        17
    skiy  
       238 天前
    @FONG2 若在你服务器中 CURL 实际地址也是下载,那就不是 NGINX 的问题了吧。若是只有反代的地址是下载,才是 NGINX 的问题。反代没涉及到下载的,是不是你 NGINX 的配置问题?可以试试的上面发的那串(需要重启 NGINX )
    eason1874
        18
    eason1874  
       238 天前
    @FONG2 让后端给请求打日志,然后访问了看日志就知道请求有没有到后端了。请求没有到后端就是反代配置问题
    Chism
        19
    Chism  
       238 天前
    我的 nginx 把版本从 1.21 换到 1.19 ,竟然导致 domain 前端调用 domain/的 api 报跨域
    gengchun
        20
    gengchun  
       238 天前
    见过太多离谱的部署了,不评价 OP 。

    @Chism 确认一下 ngx 编译参数,可能是配置路径问题导致用了不正确的配置。
    keepeye
        21
    keepeye  
       238 天前
    location / {
    return 403;
    }

    测一下有没有走到里面
    adoal
        22
    adoal  
       238 天前
    nginx 没配 root 也有个默认 root 的,也许就是跟 tomcat 一起了呢
    jptx
        23
    jptx  
       238 天前
    强烈怀疑问题出在 Tomcat 及应用里,可能某个配置导致 Tomcat 直接按普通资源文件来处理 jsp 文件了,并没有走 jsp 的解析逻辑
    lower
        24
    lower  
       238 天前
    你 tomcat 里面跑了多少项目啊?反代到 tomcat 根路径就好,简简单单的最不容易出问题,否则相对路径映射来映射去的就会出莫名其妙的问题
    项目多就跑多个 tomcat 进程,用端口来区分明明白白的
    zanelee
        25
    zanelee  
       238 天前
    为什么要 location /abc {};然后再 http://1.1.1.1:8080/abc;
    直接这样不行吗?那个 abc
    location ^~ /abc {
    ...
    proxy_pass http://1.1.1.1:8080;
    }
    FONG2
        26
    FONG2  
    OP
       238 天前 via iPhone
    @skiy curl ng 地址是下载 curl tomcat 地址是 404
    FONG2
        27
    FONG2  
    OP
       238 天前 via iPhone
    @jptx 直接访问 tomcat 地址没有问题呢 a.jsp/报 404
    FONG2
        28
    FONG2  
    OP
       238 天前 via iPhone
    @zanelee
    @lower tomcat 就一个应用,abc.war
    tomcat 访问地址就是 1.1.1.1:8080/abc
    FONG2
        29
    FONG2  
    OP
       238 天前 via iPhone
    @adoal 那我明天配个 root 看看
    FONG2
        30
    FONG2  
    OP
       238 天前
    @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  
       238 天前 via Android
    先 curl 到 1.1.1.1:8080/abc/a.jsp/ 看是 404 还是下载源码。如果 404 ,tomcat 不背这个锅。下载源码的话,nginx 配置错了,上层 root 静态资源配置到 tomcat 去了?
    FONG2
        32
    FONG2  
    OP
       238 天前 via iPhone
    @oneisall8955 先 curl 到 1.1.1.1:8080/abc/a.jsp/ 这个是 404
    nginx Server 没配 root 地址,准备明天配一个看看
    GuuJiang
        33
    GuuJiang  
       238 天前 via iPhone
    最简单的排查方法,让 tomcat 和 nginx 跑在不同的机器上,如果不能复现,说明就是 nginx 把 jsp 当成静态资源了,与反代无关
    skiy
        34
    skiy  
       238 天前 via iPhone
    @FONG2 看我 12 楼的例子。这是我能跑的反代。另外,我记得 root 好像要必配的。你配置好时,有尝试 nginx -t 了没?有 reload 或者 restart nginx 了没?

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