skills/java-file-upload-audit/SKILL.md
Java Web 源码文件上传漏洞审计工具。用于从源码中识别所有文件上传入口并检查上传路径、文件名处理与校验逻辑漏洞。适用于:(1) 识别 Servlet/Commons FileUpload 与 Spring Boot MultipartFile 上传实现,(2) 发现任意文件上传、路径穿越与可执行文件上传漏洞,(3) 检查文件名/目录/类型/大小校验是否缺失或可绕过,(4) 审计上传目录与访问控制。**支持反编译 .class/.jar 文件提取上传逻辑**。结合 java-route-mapper 使用可实现完整的路由+文件上传审计。
npx skillsauth add ruoji6/java-audit-skills java-file-upload-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 项目源码,识别文件上传实现并检测上传相关漏洞(任意文件上传、路径穿越、文件覆盖、Web 根目录可执行等)。
此技能必须完整分析所有上传相关代码,不允许省略。
详见 SEVERITY_RATING.md
{C/H/M/L}-UPLOAD-{序号}| 前缀 | 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-upload-audit 必须在 java-route-mapper 之后执行,基于已梳理的路由信息进行审计。
┌─────────────────────────────────────────────────────────────────┐
│ 完整审计流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [步骤1] java-route-mapper │
│ │ │
│ │ 输出: │
│ │ ├─ 所有 HTTP 路由列表 │
│ │ ├─ 每个路由的参数定义 │
│ │ │ ├─ 参数名、类型 │
│ │ │ └─ JSON 内部字段 │
│ │ └─ Burp Suite 请求模板 │
│ │ │
│ ↓ │
│ [步骤2] java-file-upload-audit(本技能) │
│ │ │
│ │ 输入:java-route-mapper 的输出 │
│ │ │
│ │ 执行: │
│ │ ├─ 快速扫描上传实现 │
│ │ ├─ 参数-上传映射分析 │
│ │ ├─ 校验逻辑与保存路径分析 │
│ │ └─ 执行条件分析 │
│ │ │
│ ├─── 需要深入追踪 ───→ 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_upload_audit/
└── {project_name}_file_upload_audit_{timestamp}.md ← 本技能输出
如果 route_mapper 输出不存在,建议先运行:
Skill(skill="java-route-mapper", args="--project {project_path}")
| 信息 | 用途 | |:-----|:-----| | 路由路径 | 定位上传 Controller/Servlet 入口 | | 参数名 + 类型 | 识别 MultipartFile / FileItem / fileName 参数 | | JSON 内部字段 | 识别嵌套上传参数 | | 参数用途描述 | 判断是否用于文件名或保存路径 |
目标:快速定位上传相关代码,不遗漏关键点。
# 1.1 Servlet/Commons FileUpload
rg -n "ServletFileUpload|DiskFileItemFactory|FileItem|isMultipartContent" --glob="*.java"
# 1.2 Spring Boot MultipartFile
rg -n "MultipartFile|@RequestParam\\(\"file\"\\)|transferTo\\(" --glob="*.java"
# 1.3 文件名/路径相关
rg -n "getOriginalFilename|getName\\(\\)|getRealPath\\(\"/uploads\"\\)|uploadDir" --glob="*.java"
rg -n "new File\\(|Paths\\.get\\(|Path\\.of\\(|File\\.separator" --glob="*.java"
# 1.4 上传接口路由
rg -n "@PostMapping\\(|@RequestMapping\\(.*upload|/upload" --glob="*.java"
输出:高危文件清单(按优先级排序)
| 优先级 | 文件类型 | 审计重点 |
|:-------|:---------|:---------|
| P0 | *Controller.java / *Servlet.java 中包含 upload 逻辑 | MultipartFile/FileItem |
| P1 | *Service.java, *ServiceImpl.java | 文件保存路径/重命名 |
| P2 | *Util.java, *Storage.java, *File*.java | 通用存储封装 |
| P3 | *Config.java, application.yml | 文件大小/目录配置 |
基于 route_mapper 输出,检查每个上传参数是否影响文件名或保存路径。
| 参数来源 | 参数名 | 类型 | 漏洞等级 |
|:---------|:-------|:-----|:-----|
| @RequestParam | file | MultipartFile | 高危 - 直接上传 |
| FileItem | item | FileItem | 高危 - fileName 可控 |
| @RequestParam | fileName | String | 高危 - 文件名拼接 |
| JSON | upload.path | String | 高危 - 目录拼接 |
HTTP 参数: file (MultipartFile)
↓
Controller.handleFileUpload(file)
↓
file.getOriginalFilename() ← 文件名来源
↓
Paths.get(uploadDir).resolve(fileName)
↓
file.transferTo(filePath) ← 上传写入点
对每个上传写入点,检查:
文件名来源是否可控?
getOriginalFilename() / item.getName() → 高危是否有路径规范化与目录限制?
getCanonicalPath() + 固定上传目录 → 较安全是否做类型/内容校验?
上传目录是否在 Web 根目录?
getRealPath("/uploads") / /uploads/ → 高危当上传逻辑复杂或参数多层传递时,调用 java-route-tracer 获取完整调用链并补充校验路径分析。
识别特征:
ServletFileUpload.isMultipartContent(request)DiskFileItemFactory / ServletFileUploadupload.parseRequest(request) → List<FileItem>item.getName() 作为文件名item.write(storeFile) 写入文件getServletContext().getRealPath("/uploads") 作为保存目录Notion 记录要点:
name="file" 不会被校验。upload.setSizeMax(5MB)),未见扩展名/类型/路径校验。识别特征:
@RequestParam("file") MultipartFile filefile.getOriginalFilename()file.transferTo(filePath)uploadDir = "/uploads/"Notion 记录要点:
@RequestParam("file") 会校验表单字段名,需要 name="file"。详细检测规则参见 UPLOAD_RULES.md
当源码不可用时,必须使用 CFR 反编译器反编译上传相关类(详见 java-shared/DECOMPILE_STRATEGY.md)。
# 反编译单个上传相关类
java -jar {CFR_JAR} /path/to/UploadController.class --outputdir {output_path}/decompiled
# 反编译上传相关目录
find /path/to/WEB-INF/classes/com/example/upload -name "*.class" | xargs java -jar {CFR_JAR} --outputdir {output_path}/decompiled
# 反编译多个指定文件
java -jar {CFR_JAR} /path/to/UploadController.class /path/to/FileStorageService.class /path/to/UploadUtil.class --outputdir {output_path}/decompiled
| 类型 | 匹配模式 | 目的 |
|------|----------|------|
| Controller/Servlet | *Upload*Controller.class, *Servlet.class | 提取上传入口 |
| Service/Storage | *Storage*.class, *FileService*.class | 追踪保存路径 |
| 工具类 | *UploadUtil*.class, *FileUtil*.class | 查找通用校验 |
| 配置类 | *Config*.class | 获取上传目录/大小限制 |
反编译输出要求:
发现上传逻辑后,必须检查该逻辑是否真的会被执行!
| 检查项 | 说明 | 影响 | |--------|------|------| | 权限校验 | 仅管理员可访问 | 影响可利用性 | | 参数校验 | 字段名/类型/大小校验 | 降低漏洞可利用性 | | 目录限制 | 固定上传目录 | 降低路径穿越 | | 可访问性 | 上传目录是否可 Web 访问 | 决定是否可执行 |
结论分级必须标注:✅ 已确认可利用 / ⚠️ 待验证 / ❌ 不可利用 / 🔍 环境依赖
输出单个综合审计报告文件:
{project_name}_audit/file_upload_audit/
└── {route_name}/
└── {project_name}_file_upload_audit_{timestamp}.md
路由名说明:
/api/file/upload → api_file_upload严格按照 references/OUTPUT_TEMPLATE.md 中的填充式模板生成输出文件。
{project_name}_file_upload_audit_{YYYYMMDD_HHMMSS}.mddevelopment
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 使用可实现完整的路由+调用链审计。