我正在我们的某个服务器上处理一些安全警报,其中一个文件下载' 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文件本身访问它。
谢谢,
...汤姆
答案 0 :(得分: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页面的编写者/维护者有责任确保只访问有效路径。