Java代码审计-文件相关漏洞
描述
- 文件上传
任意文件上传漏洞属于Web应用系统中较为经典、同时也是危害较大的漏洞,在Web1.0时代,恶意攻击者的主要攻击手法是将可执行脚本(WebShell)上传至目标服务器,以达到控制目标服务器的目的。任意文件上传漏洞的本质是在进行文件上传操作时未对文件类型进行检测或检测功能不规范导致被绕过,从而使攻击者上传的可执行脚本(WebShell)被上传至服务器并成功解析。危害:
- 获取WebShell
- 攻击内网
- 破坏服务器数据等
现在的前后端分离的方式导致文件上传漏洞有些可能只会导致钓鱼页面上传等
- 任意文件下载
一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。
- 任意文件删除
攻击者从寻找上删除的功能,正常删除功能的文件没有经过校验或者不严格,攻击者控制这个可操作的变量配合目录遍历进行删除其他文件。
审计技巧
关键字:
- JDK原始的java.io.FileInputStream类
- JDK原始的java.io.RandomAccessFile类
- Apache Commons IO提供的org.apache.commons.io.FileUtils类
- JDK1.7新增的基于NIO非阻塞异步读取文件的java.nio.channels.AsynchronousFileChannel类。
- JDK1.7新增的基于NIO读取文件的java.nio.file.Files类。常用方法如:Files.readAllBytes、Files.readAllLines
- FileInputStream
- FileOutputStream
- File
- FileUtils
- IOUtils
- BufferedReader
- ServletFileUpload
- MultipartFile
- CommonsMultipartFile
- PrintWriter
- ZipInputStream
- ZipEntry.getSize
- Delete
- deleteFile
- fileName
- filePath
找到对应的地址后跟踪方法调用栈,最后找他的入口点即客户端传参获取地点进行分析
防御方式
- 文件上传
对于文件上传漏洞的修复一般最有效的方法是限制上传类型并对文件进行重命名,这里笔者进行了一些简单的总结:采取白名单策略限制运行上传的类型;对文件名字进行重命名;去除文件名中的特殊字符;检测文件后缀、MIME类型等。
-
任意文件下载及任意文件删除
-
正则严格判断用户输入参数的格式
-
检查使用者输入的文件名是否有
…
的目录阶层字符 -
限定文件访问的范围
参考地址:
山石JavaWeb靶场的文件上传相关页面,具体代码见com.hillstone.controller.FileUpload