# Java File Audit

Java 源码文件操作类漏洞审计。当在 Java 白盒审计中需要检测文件相关漏洞时触发。 覆盖 5 类文件风险: 任意文件上传(MultipartFile/Servlet...

- Repository: https://github.com/wgpsec/AboutSecurity (1833 stars)
- Category: Engineering
- License: see repository
- Last updated: 2026-10-24
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add wgpsec/AboutSecurity --skill java-file-audit -g -a claude-code -y`
Codex: `npx skills add wgpsec/AboutSecurity --skill java-file-audit -g -a codex -y`
Cursor: `npx skills add wgpsec/AboutSecurity --skill java-file-audit -g -a cursor -y`
Gemini CLI: `npx skills add wgpsec/AboutSecurity --skill java-file-audit -g -a gemini-cli -y`

## Description

Java 源码文件操作类漏洞审计。当在 Java 白盒审计中需要检测文件相关漏洞时触发。 覆盖 5 类文件风险: 任意文件上传(MultipartFile/Servlet Part/类型绕过)、任意文件读取(NIO/IO流/路径穿越)、 任意文件写入(覆盖配置/WebShell落地)、归档提取漏洞(ZipInputStream/Zip Slip)、文件删除/重命名竞争。 需要 java-audit-pipeline 提供的数据流证据。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# Java 文件操作类漏洞源码审计
本 skill 聚焦源码层面判断"文件操作漏洞是否成立"，核心是验证路径可控性、文件名可控性和内容可控性。构造上传绕过 payload、目录穿越利用链等运行时利用技术属于对应黑盒 exploit skill 范畴。

## 深入参考

- 5 类文件漏洞的危险模式 / 安全模式代码对比 / EVID 证据示例 → [references/file-vuln-patterns.md](references/file-vuln-patterns.md)

---

## Sink 分类决策树

根据遇到的 Sink 函数类型，进入不同审计分支:

| Sink 函数 | 分支 | 典型严重度 |
|-----------|------|-----------|
| `MultipartFile.transferTo()` / `Part.write()` | 文件上传 | Critical-High |
| `FileInputStream` / `Files.readAllBytes()` / `new File(path)` / `ClassLoader.getResourceAsStream()` | 文件读取 | High-Medium |
| `FileOutputStream` / `Files.write()` / `FileWriter` | 文件写入 | Critical-High |
| `ZipInputStream.getNextEntry()` / `ZipFile.entries()` | 归档提取 | High |
| `File.delete()` / `Files.delete()` | 文件删除 | Medium |

## 文件上传审计要点

上传漏洞本质是三要素同时满足: 可执行扩展名 + Web 可达存储路径 + 未被重命名/内容清洗。

- **MultipartFile**: `file.transferTo(new File(dir + file.getOriginalFilename()))`, `getOriginalFilename()` 返回客户端原始文件名，可含 `../` 路径穿越或恶意扩展名
- **Servlet Part**: `part.write(uploadPath + fileName)`, 检查 `fileName` 是否来自 `part.getSubmittedFileName()` 且未净化
- **ContentType 校验 vs 扩展名校验**: `file.getContentType()` 来自客户端 HTTP 头，完全可伪造；扩展名白名单更可靠但需 `toLowerCase()` 处理
- **存储路径可控性**: 文件名中的 `../` 跳出上传目录，`Paths.get(dir, fileName).normalize()` 后需验证前缀
- **Spring multipart-config**: `spring.servlet.multipart.location` / `max-file-size` / `max-request-size` 配置影响上传行为，检查是否限制合理
- **文件头 Magic bytes 校验**: 真实类型检测需读取文件头字节（如 `ImageIO.read()` 或 Apache Tika），而非信任 Content-Type

## 文件读取审计要点

路径穿越是文件读取漏洞的核心，`../` 及其变体可跳出预期目录:

The rest: https://github.com/wgpsec/AboutSecurity/blob/HEAD/skills/code-audit/java/java-file-audit/SKILL.md
