0

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

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

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

现在显然应该通过对用户输入进行清理来纠正“目录遍历”部分(这个脚本还没有这样做)。但是,以下 URI 也将 web.xml 传递给用户,但目录遍历的输入清理在这里没有帮助,除非清理检查“WEB-INF”和其他“非法”目录......

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

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

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

谢谢,

汤姆...

4

1 回答 1

1

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

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

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

假设你在 Linux 上运行,这个 URL 有什么作用:

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

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

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

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

于 2016-03-18T17:03:29.433 回答