从 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.
总结:默认情况下是不可能的。但是(糟糕的)代码和配置可以使这成为可能。
是否有人可以使用 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.
总结:默认情况下是不可能的。但是(糟糕的)代码和配置可以使这成为可能。