skills/java-file-read-audit/SKILL.md
Java Web 源码任意文件读取漏洞审计工具。从源码中识别所有文件读取操作并检测路径遍历漏洞。适用于:(1) 识别文件读取框架和实现方式,(2) 发现任意文件读取漏洞,(3) 检测路径遍历漏洞,(4) 审计文件路径参数校验逻辑。支持 BufferedReader、Scanner、Files.lines/readAllLines/readAllBytes 等方法。**支持反编译 .class/.jar 文件提取文件操作逻辑**。结合 java-route-mapper 使用可实现完整的路由+文件读取审计。
npx skillsauth add ruoji6/java-audit-skills java-file-read-auditInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
检查 Java Web 项目源码,识别文件读取操作实现,检测任意文件读取和路径遍历漏洞。
此技能必须完整分析所有文件读取相关代码,不允许省略。
详见 SEVERITY_RATING.md
{C/H/M/L}-FILE-{序号}| 前缀 | CVSS 3.1 | 含义 | |------|----------|------| | 🔴 C | 9.0-10.0 | 可直接导致系统沦陷 | | 🟠 H | 7.0-8.9 | 可造成重大损害 | | 🟡 M | 4.0-6.9 | 可造成一定损害 | | 🔵 L | 0.1-3.9 | 安全加固建议 |
java-file-read-audit 应在 java-route-mapper 之后执行,基于已梳理的路由信息进行审计。
┌─────────────────────────────────────────────────────────────────┐
│ 完整审计流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [步骤1] java-route-mapper │
│ │ │
│ │ 输出: │
│ │ ├─ 所有 HTTP 路由列表 │
│ │ ├─ 每个路由的参数定义 │
│ │ │ ├─ 参数名、类型 │
│ │ │ └─ JSON 内部字段 │
│ │ └─ Burp Suite 请求模板 │
│ │ │
│ ↓ │
│ [步骤2] java-file-read-audit(本技能) │
│ │ │
│ │ 输入:java-route-mapper 的输出 │
│ │ │
│ │ 执行: │
│ │ ├─ 快速扫描文件操作 │
│ │ ├─ 参数-文件路径映射分析 │
│ │ ├─ 检查每个 String 参数是否用作文件路径 │
│ │ └─ 执行条件分析 │
│ │ │
│ ├─── 需要深入追踪 ───→ java-route-tracer │
│ │ │ │
│ │ ←── 返回调用链信息 ────┘ │
│ │ │
│ ↓ │
│ [步骤3] 输出综合审计报告 │
│ │
└─────────────────────────────────────────────────────────────────┘
在开始审计前,必须先检查是否已有 java-route-mapper 的输出文件:
{project_name}_audit/
├── route_mapper/
│ ├── {project_name}_route_mapper_{timestamp}.md ← 主索引(先读此文件定位模块详情)
│ ├── {module_name}/
│ │ └── {project_name}_module_{module_name}_{timestamp}.md ← 模块详情
│ └── webservice/
│ └── {project_name}_ws_{service_name}_{timestamp}.md
└── file_read_audit/
└── {project_name}_file_read_audit_{timestamp}.md ← 本技能输出
如果 route_mapper 输出不存在,必须先运行:
Skill(skill="java-route-mapper", args="--project {project_path}")
| 信息 | 用途 |
|:-----|:-----|
| 路由路径 | 定位 Controller/Action 入口 |
| 参数名 + 类型 | 识别 String 类型高危参数 |
| JSON 内部字段 | 识别嵌套参数(如 fileInfo.path) |
| 参数用途描述 | 判断是否用于文件路径 |
目标:快速定位文件读取相关代码,不遗漏关键点。
# 1.1 搜索文件读取方法
grep -ri "BufferedReader\|FileReader\|FileInputStream" --include="*.java"
grep -ri "Scanner.*File\|Scanner.*Path" --include="*.java"
grep -ri "Files.lines\|Files.readAllLines\|Files.readAllBytes" --include="*.java"
# 1.2 搜索文件下载/读取接口
grep -ri "download\|readFile\|getFile\|viewFile" --include="*.java"
grep -ri "@RequestMapping.*download\|@GetMapping.*download" --include="*.java"
# 1.3 搜索路径拼接模式
grep -ri "new File.*\+" --include="*.java"
grep -ri "Paths.get.*\+" --include="*.java"
grep -ri "File.separator" --include="*.java"
# 1.4 搜索路径参数
grep -ri "filePath\|fileName\|file\|path" --include="*.java" | grep "@RequestParam\|@PathVariable"
输出:高危文件清单(按优先级排序)
| 优先级 | 文件类型 | 审计重点 |
|:-------|:---------|:---------|
| P0 | *Controller.java 中包含 download/readFile 的方法 | filePath, fileName 参数 |
| P1 | *Service.java, *ServiceImpl.java | 文件路径处理逻辑 |
| P2 | *Util.java, *Helper.java | 通用文件读取方法 |
| P3 | *Dao.java, *Repository.java | 配置文件读取 |
基于 java-route-mapper 的输出,检查每个参数是否用作文件路径。
从 route_mapper 输出中提取所有 String 类型参数:
| 参数来源 | 参数名 | 类型 | 文件读取漏洞可能性 |
|:---------|:-------|:-----|:-------------|
| @RequestParam | filePath | String | 高危 - 直接用作路径 |
| @RequestParam | fileName | String | 高危 - 文件名拼接 |
| @RequestParam | file | String | 高危 - 文件路径 |
| @PathVariable | path | String | 高危 - URL 路径参数 |
| JSON | fileInfo.path | String | 高危 - JSON 内部字段 |
对每个高危参数,追踪其在代码中的使用:
HTTP 参数: filePath (String)
↓ 传递
Controller.download(filePath)
↓ 传递
Service.readFile(filePath)
↓ 拼接
basePath + File.separator + filePath
↓ 使用
new FileInputStream(fullPath) ← 文件读取点
对阶段1发现的每个文件读取点,检查:
文件路径是否可控?
是否有路径校验?
是否过滤路径遍历字符?
../, ..\\ → 可能安全(需测试绕过)当发现以下情况时,调用 java-route-tracer 获取完整调用链:
| 触发条件 | 调用方式 |
|:---------|:---------|
| 参数经过多层传递 | Skill(skill="java-route-tracer", args="--route {route}") |
| 路径拼接逻辑复杂 | Skill(skill="java-route-tracer", args="--route {route}") |
| 校验逻辑不明确 | Skill(skill="java-route-tracer", args="--route {route}") |
发现文件读取后,必须检查执行条件(详见后续章节)。
整合所有分析结果,生成综合审计报告。
详细规则参见 FILE_READ_METHODS.md
| 方法类别 | 识别特征 | 风险点 |
|---------|----------|--------|
| BufferedReader | new BufferedReader(new FileReader(path)) | path 参数来源 |
| Scanner | new Scanner(new FileReader(path)) | path 参数来源 |
| Files.lines | Files.lines(Path.of(path)) | path 参数来源 |
| Files.readAllLines | Files.readAllLines(Path.of(path)) | path 参数来源 |
| Files.readAllBytes | Files.readAllBytes(Path.of(path)) | path 参数来源 |
| FileInputStream | new FileInputStream(path) | path 参数来源 |
当源码不可用时,必须使用 CFR 反编译器反编译文件操作相关类。
详细策略参见 DECOMPILE_STRATEGY.md
# 反编译单个 Controller/Service 类
java -jar {CFR_JAR} /path/to/FileController.class --outputdir {output_path}/decompiled
# 反编译文件操作相关目录
find /path/to/WEB-INF/classes/com/example/controller -name "*.class" | xargs java -jar {CFR_JAR} --outputdir {output_path}/decompiled
# 反编译多个指定文件
java -jar {CFR_JAR} /path/to/FileController.class /path/to/FileService.class /path/to/FileUtil.class --outputdir {output_path}/decompiled
输出文件命名规范:
{output_dir} 目录{ClassName}.javacom/example/controller/FileController.java| 类型 | 匹配模式 | 目的 |
|------|----------|------|
| Controller | *Controller.class | 提取路由和参数定义 |
| Service | *Service.class, *ServiceImpl.class | 追踪文件操作调用链 |
| 工具类 | *FileUtil*.class, *FileHelper*.class | 提取通用文件读取方法 |
| DAO | *Dao.class, *Repository.class | 配置文件读取逻辑 |
发现文件读取代码后,必须检查该代码是否真的会被执行!
在发现文件读取后,必须检查是否存在路径校验:
| 检查模式 | 代码特征 | 处理方式 |
|----------|----------|----------|
| 白名单目录 | path.startsWith("/upload/") | 标注为受限路径 |
| 扩展名校验 | fileName.endsWith(".txt") | 检查是否可绕过 |
| 路径规范化 | new File(path).getCanonicalPath() | 检查是否完整 |
| 无校验 | 直接使用用户输入 | 标注为高危 |
追踪从入口到文件读取的完整路径,检查:
| 检查项 | 说明 | 影响 |
|--------|------|------|
| 提前 return | if (!validate()) return; | 可能阻止执行 |
| 异常抛出 | throw new SecurityException() | 代码不执行 |
| 条件不满足 | if (false) 等死代码 | 代码不执行 |
| 权限限制 | 仅管理员可访问 | 需确认权限 |
| 状态 | 含义 | 后续操作 | |------|------|----------| | ⚠️ 待验证 | 代码存在文件读取,但执行条件未确认 | 需确认目标环境 | | ✅ 已确认可利用 | 已验证代码路径会执行且无有效校验 | 进行漏洞利用测试 | | ❌ 不可利用 | 存在有效的安全校验 | 标注原因,降低优先级 | | 🔍 环境依赖 | 漏洞存在但仅在特定条件下可利用 | 标注环境条件 |
| 危险模式 | 代码示例 | 风险说明 |
|:---------|:---------|:---------|
| 直接拼接 | basePath + fileName | 未过滤 ../ |
| File.separator 拼接 | basePath + File.separator + fileName | 可路径遍历 |
| 字符串格式化 | String.format("%s/%s", base, file) | 未过滤 ../ |
| Path.of 拼接 | Path.of(basePath, fileName) | 可能路径遍历 |
| Paths.get 拼接 | Paths.get(basePath).resolve(fileName) | 需检查规范化 |
| 类型 | 危险模式 | 安全模式 |
|------|----------|----------|
| 路径拼接 | basePath + fileName | 白名单校验 + 规范化 |
| 文件读取 | new FileInputStream(userInput) | getCanonicalPath() 校验 |
| 路径遍历 | 无过滤 ../ | path.contains("..") 拦截 |
| 扩展名 | 不校验 | 白名单扩展名 |
安全模式示例:
// 安全: 路径规范化 + 白名单目录校验
String basePath = "/var/uploads";
File file = new File(basePath, fileName);
String canonicalPath = file.getCanonicalPath();
if (!canonicalPath.startsWith(basePath)) {
throw new SecurityException("Path traversal detected");
}
在审计开始时,必须执行以下搜索:
# 文件读取方法检测
grep -r "FileInputStream\|FileReader\|BufferedReader" --include="*.java"
grep -r "Files.readAllBytes\|Files.readAllLines\|Files.lines" --include="*.java"
# 路径拼接检测
grep -r "new File.*\+" --include="*.java"
grep -r "File.separator" --include="*.java"
# 下载接口检测
grep -r "download\|readFile\|getFile" --include="*.java"
当发现以下情况时,必须加载 java-route-tracer 技能进行深度追踪:
| 场景 | 说明 | 操作 | |------|------|------| | 参数经过多层传递 | HTTP 参数经 Controller → Service → Util 多层传递后用作文件路径 | 加载 java-route-tracer | | 路径拼接复杂 | 多处路径拼接和转换 | 加载 java-route-tracer | | 校验逻辑分散 | 校验逻辑在不同类/方法中 | 加载 java-route-tracer |
输出单个综合审计报告文件:
{project_name}_audit/file_read_audit/
└── {route_name}/
└── {project_name}_file_read_audit_{timestamp}.md # 综合审计报告
路由名说明:
/api/file/download → api_file_download/download.action → download严格按照 references/OUTPUT_TEMPLATE.md 中的填充式模板生成输出文件。
{project_name}_file_read_audit_{YYYYMMDD_HHMMSS}.md在标记审计完成前,必须执行以下检查:
development
Java Web 源码 XXE (XML External Entity) 漏洞审计工具。从源码中识别所有 XML 解析操作并检测外部实体注入漏洞。适用于:(1) 识别 XML 解析器类型和实现方式,(2) 发现 XXE 注入漏洞,(3) 检查外部实体防护配置情况,(4) 审计 XML 输入来源与回显逻辑。支持 XMLReader、SAXBuilder、SAXReader、SAXParserFactory、DocumentBuilderFactory 五种主流解析器。**支持反编译 .class/.jar 文件提取 XML 解析逻辑**。结合 java-route-mapper 使用可实现完整的路由+XXE审计。
development
Java 组件版本漏洞检测工具。扫描 pom.xml、build.gradle 或 jar 文件中的第三方依赖,匹配已知漏洞规则(CVE)并生成漏洞检测报告。适用于:(1) Java 项目依赖安全审计,(2) 识别 Log4j、Fastjson、Shiro、Spring 等高危组件漏洞,(3) jar 包反编译后的依赖提取。支持按目录层级分组输出,支持通过 CFR 反编译 .class/.jar 文件提取依赖信息。
development
Java Web 源码 SQL 注入漏洞审计工具。从源码中定位所有 SQL 执行入口并检测注入漏洞。适用于:(1) 识别 SQL 执行框架和实现方式,(2) 发现 SQL 注入漏洞,(3) 检查参数化查询使用情况,(4) 检测动态 SQL 拼接漏洞。支持 JDBC、MyBatis、Hibernate 三种主流框架。**支持反编译 .class/.jar 文件提取 SQL 逻辑**。结合 java-route-mapper 使用可实现完整的路由+SQL注入审计。
development
Java Web 源码路由多层级调用链追踪工具。根据用户指定的路由路径,追踪从 Controller/Action 到 DAO 层的完整调用链,输出每一层的文件位置、方法签名和可传入参数。适用于多种漏洞类型的参数流向追踪:(1) SQL注入 - 追踪参数到SQL拼接点,(2) 命令注入 - 追踪参数到Runtime.exec(),(3) SSRF - 追踪参数到HTTP请求,(4) XSS - 追踪参数到响应输出,(5) 文件操作 - 追踪参数到File操作,(6) XXE/反序列化/LDAP注入/表达式注入等。支持 Spring MVC、Struts 2、Servlet、JAX-RS 等框架。**支持反编译 .class/.jar 文件提取调用链**。结合 java-route-mapper 使用可实现完整的路由+调用链审计。