Java 文件或目录恶意访问漏洞
- 任意文件、目录复制
- 任意文件读取/下载
- 任意文件、目录修改/重命名
- 任意文件、目录删除
我们通常把这类漏洞归为一个类型,因为产生漏洞的原因都是因为程序对文件或目录访问控制不严、程序内部逻辑错误导致的任意文件或目录恶意访问漏洞。
任意目录遍历漏洞顾名思义攻击者可以通过漏洞遍历出服务器操作系统中的任意目录文件名,从而导致服务器敏感信息泄漏,某些场景下(如遍历出网站日志、备份文件、管理后台等)甚至可能会导致服务器被非法入侵。
Java 任意目录遍历漏洞示例代码:
当我们通过不断修改URL中的dir参数即可遍历出制定目录的任意文件,漏洞演示URL:http://localhost:8080/file-list.jsp?dir=/Users
这个漏洞可能由Web应用本身的开发不规范导致,也有可能是因为、项目依赖的第三方库
、Web服务器自身
导致的。如果是由于自身开发不规范导致的那么需要程序严格控制用户传入目录参数是否合法!
请求遍历非系统限制的目录示例:
任意文件读写漏洞即因为没有验证请求的资源文件是否合法导致的,此类漏洞在Java中有着较高的几率出现,任意文件读取漏洞原理很简单,但是在这个问题上翻车的有不乏一些知名的中间件:Weblogic
、Tomcat
、Resin
又或者是主流MVC框架:Spring MVC
、Struts2
。任意文件读写、下载的逻辑大致是一致的本节不再一一举例。
任意文件读取示例代码file-read.jsp:
任意文件读取测试:
任意文件删除测试:http://localhost:8080/file-delete.jsp?file=/tmp/test.txt
任意文件读/写/删除漏洞修复
修改方案主要是严格校验用户输入的文件名和目录是否合法,可参考本节的任意目录遍历漏洞修复方式。
在审计文件读取功能的时候要非常仔细,或许很容易就会有意想不到的收获!快速发现这类漏洞得方式其实也是非常简单的,在IDEA中的项目中重点搜下如下文件读取的类。
- JDK原始的
java.io.FileInputStream
、java.io.FileOutputStream
类 - JDK原始的
java.io.RandomAccessFile
类 - Apache Commons IO提供的
org.apache.commons.io.FileUtils
类 - JDK1.7新增的基于NIO非阻塞异步读取文件的
java.nio.channels.AsynchronousFileChannel
类。 java.io.File
类的list
、listFiles
、listRoots
、delete
方法。
如果仍没有什么发现可以搜索一下FileUtil
很有可能用户会封装文件操作的工具类。