阻止从 JSP 访问 WEB-INF

Preventing access to WEB-INF from JSP

我正在我们的一台服务器上处理一些安全警报,其中 'file download' JSP 文件能够让用户下载 Web 应用程序的 WEB-INF 内容(位于在站点的根文件夹中)。这是一个非常简单的文件,写于 2007 年,它使用 java.io.FileInputStream 未经过滤的输入 return 用户的文件。

警报实际上声称这是一个目录遍历问题,这是一种方式,因为以下 URI 会为用户下载 web.xml:

http://domain.com/filedownload.jsp?filename=../../WEB-INF/web.xml&filepath=some/directory/

现在显然 'directory traversal' 部分应该通过对用户输入进行清理来更正(此脚本尚未执行此操作)。但是,以下 URI 也将 web.xml 传递给用户,但目录遍历的输入清理在这里无济于事,除非清理检查 'WEB-INF' 和其他 'illegal' 目录...

http://domain.com/filedownload.jsp?filename=web.xml&filepath=WEB-INF/

是否有标准化的方法来防止在常见的 servlet 容器中出现这种情况,或者这是否需要完全由代码开发人员管理?我注意到 Java 'normalize()' 函数不会从用户输入中删除此目录。

我试图为此寻找答案,但我所能找到的只是关于直接阻止 'serving' 的 WEB-INF 的信息,但没有关于阻止从 JSP 访问它的信息文件本身。

谢谢,

汤姆...

您说 JSP 页面正在使用 java.io.FileInputStream 读取文件。这是一个标准 Java class,它不知道它在 servlet 容器中 运行。

因此 java.io.FileInputStream 将能够访问用户进程可以访问的任何文件,servlet 容器 (JVM) 在 运行 下。您无法在 servlet 容器中配置任何东西来防止这种情况发生。

您可能希望确保无法访问文件系统其他区域中与 servlet 容器完全无关的文件,例如像“/etc/passwd”。

假设您 运行 在 Linux,这个 URL 是做什么的:

http://domain.com/filedownload.jsp?filename=passwd&filepath=/etc/

如果 return 文件,你的问题就大了!也许创建警报的安全软件(不确定您使用的是什么?)会阻止下载。如果不是,操作系统文件权限可以提供帮助,只要 Web 服务器不是 运行 在 root 或其他特权帐户下,但这只是一个短期的紧急修复。

所以不,在常见的 servlet 容器中没有防止这种情况的标准化方法,是的,它确实需要完全由代码开发人员管理。

使用 java.io.FileInputStream 时,JSP 页面的编写者/维护者有责任确保仅访问有效路径。