【问题标题】:Access from internet the web.xml file of an applicaiton从 Internet 访问应用程序的 web.xml 文件
【发布时间】:2015-07-17 22:00:40
【问题描述】:

是否有人可以通过互联网访问或查看 Web 应用程序的 web.xml 文件,使用类似 wget 工具的东西?我问的是用户名等安全原因

【问题讨论】:

  • 据我所知,这是不可能的

标签: security jakarta-ee servlets web.xml


【解决方案1】:

specification 无法通过公共 URL 直接访问 /WEB-INF(和 /META-INF)内容。以下是上述规范的相关摘录:

10.5 目录结构

...

另外,除了 对于静态资源打包在 JAR 文件中的情况,来自 客户端访问 WEB-INF/ 目录中的资源必须返回一个 SC_NOT_FOUND(404) 响应。

10.6 Web 应用存档文件

...

此外,任何访问 META-INF 中资源的请求 必须使用 SC_NOT_FOUND(404) 响应返回目录。

但是,已经有一些实现、配置,甚至是本地开发的 servlet 或过滤器,它们引入了一个安全漏洞,使这成为可能。所有这些安全问题归结为由RequestDispatcher#forward() 甚至RequestDispatcher#include()(因此请注意动态<jsp:include>!)呼叫转发或包含由客户端控制的请求路径或参数指定的资源,如果有必要使用../的路径遍历。

这是暴露安全问题的此类 servlet 的最简单示例:

@WebServlet("/test/*")
public class TestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher(request.getPathInfo()).forward(request, response);
    }

}

在 Tomcat(用 8.0.21 测试)上,您可以使用上述 servlet 通过调用 http://localhost:8080/context/test/WEB-INF/web.xml 获取 web.xml 内容。这样的 servlet 通常作为本地 MVC 前端控制器或调度程序模式的一部分来实现。像 JSF 和 Spring MVC 这样的体面的 MVC 框架不应该有这个问题。

而且,一些用户在 /* 甚至 / 的“包罗万象” URL 模式上配置 MVC 前端控制器,然后将 /static/* 上的 CSS/JS/图像等静态资源重新映射到容器的default servlet 像这样:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

在旧的 Tomcat 版本(7.0.4 之前)上,最终用户可以通过这样的映射获得/WEB-INF(和/META-INF)的内容。这个问题之前在这个问答中提到过:Tomcat serving static content。实际上,这种映射方法是错误的,应该在这个答案中描述的过滤器的帮助下解决:How to access static resources when mapping a global front controller servlet on /*。另见Tomcat issue 50026

总结:默认情况下这是不可能的。但是(糟糕的)代码和配置可以使这成为可能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多