【发布时间】:2015-07-17 22:00:40
【问题描述】:
是否有人可以通过互联网访问或查看 Web 应用程序的 web.xml 文件,使用类似 wget 工具的东西?我问的是用户名等安全原因
【问题讨论】:
-
据我所知,这是不可能的
标签: security jakarta-ee servlets web.xml
是否有人可以通过互联网访问或查看 Web 应用程序的 web.xml 文件,使用类似 wget 工具的东西?我问的是用户名等安全原因
【问题讨论】:
标签: security jakarta-ee servlets web.xml
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。
总结:默认情况下这是不可能的。但是(糟糕的)代码和配置可以使这成为可能。
【讨论】: