从 Internet 访问应用程序的 web.xml 文件

Access from internet the web.xml file of an applicaiton

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

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

10.5 Directory structure

...

Also, except for the case where static resources are packaged in JAR files, any requests from the client to access the resources in WEB-INF/ directory must be returned with a SC_NOT_FOUND(404) response.

10.6 Web Application Archive File

...

Also, any requests to access the resources in META-INF directory must be returned with a SC_NOT_FOUND(404) response.

但是,已经有一些实现、配置甚至是自制的 servlet 或过滤器引入了安全漏洞,使这成为可能。所有这些安全问题归结为 RequestDispatcher#forward() or even 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 测试),你可以通过调用 http://localhost:8080/context/test/WEB-INF/web.xml 使用上面的 servlet 获取 web.xml 内容。这样的 servlet 通常作为本地 MVC 前端控制器或调度程序模式的一部分来实现。体面的 MVC 框架,如 JSF 和 Spring MVC 不应该有这个问题。

并且,一些用户在 "catch-all" URL 模式 /* 甚至 / 上配置 MVC 前端控制器,然后重新映射静态资源,例如CSS/JS/images on /static/* 到容器的 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. Actually, this mapping approach is wrong and should have been solved with help of a filter as descibed in this answer: How to access static resources when mapping a global front controller servlet on /*. See also Tomcat issue 50026.

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