Component-Framework
Environment: JDK8 & Docker & Vulhub
Tools: BurpSuite ShiroAttack2 ShiroScan SB-Actuator JDumpSpider heapdump_tool
1.0 组件和框架漏洞
组件: 通常是指在软件开发中可重复利用部件或模块, 具有特定的功能或特性, 可以独立使用或集成到更大的系统中. 组件可以包括各种类型, 例: 前端UI组件, 后端服务组件, 安全组件, 数据处理组件等, 它们可以通过接口或API进行交互和集成, 构建出复杂的软件系统.
框架: 是一种软件开发工具或平台, 它提供了一套结构和规范, 用于帮助开发人员构建和组织软件应用程序. 框架通常包含了一些通用的功能模块, 设计模式, 工具和规范, 开发人员可以基于框架快速开发应用程序而不必从头开始编写所有代码
三大组件漏洞一览表:
以下本文复现三大组件经典漏洞概述表.
| 组件 | 语言 | 典型漏洞 | 指纹特征 | 利用难度 |
|---|---|---|---|---|
| Shiro | Java | 反序列化 | rememberMe | 中 |
| SpringBoot | Java | Actuator未授权 | /actuator | 低 |
| ThinkPHP | PHP | RCE | ThinkPHP标识 | 低 |
1.1 Apache Shiro-550 漏洞
01 漏洞基本信息:
Apache Shiro是一个安全组件, 用于在Java程序中提供身份验证, 授权, 加密等安全功能.
Shiro-550属于Apache Shiro项目的历史漏洞, 存在于RememberMe功能中.
RememberME:
- 功能: 提供账户记忆功能, 勾选后下次访问无需重新登录
- 特点: 若用户勾选此选项, 请求数据包
Cookie字段会多出一组数据(包含经过加密的身份信息,)
RememberME机制:
加密过程
1
用户身份信息 → Java序列化 → AES 加密(用密钥 key) → Base64编码 → 存入rememberMe Cookie
解密过程
1
取出rememberMe Cookie → Base64 解码 → AES 解密(用密钥 key) → Java反序列化 → 恢复用户身份
服务器对Cookie进行反序列化, 攻击者若能控制解密后的字节流, 就能让服务器反序列化一个恶意对象
![]()
以上RememberME机制图解
02 漏洞成因:
条件1: AES 密钥硬编码 (<=1.2.4)
在 Shiro 1.2.4 及更早版本中, AbstractRememberMeManager 类里有这样一段代码:
1 | private static final byte[] DEFAULT_CIPHER_KEY_BYTES = Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="); |
Shiro 1.2.5 之后改为每次启动随机生成密钥, 但如果开发者手动配置了弱密钥或密钥泄露, 仍然存在风险.
条件 2: Java 反序列化 + 可利用 Gadget
攻击者需要目标应用的 classpath 中存在**可利用的 gadget chain **(一组能在反序列化时触发任意代码执行的类组合), 常见的有:
Commons-Collections
Commons-Beanutils (Shiro 自身依赖, 几乎必中)
Spring AOP
JDK 原生链
两个条件同时满足 → 攻击者可以构造一个包含恶意 gadget 的序列化对象, 用已知密钥加密后放入 Cookie, 服务器反序列化时触发 RCE.
1.2 CVE-2016-4437 (漏洞实战)
注: 靶场基于Docker-Vulhub (/vulhub/shiro/CVE-2016-4437)
攻击链:
以下完整攻击链图解

01 确认目标
想要快速对目标进行针对性测试, 首先需要知道目标是否使用该组件. 一般来讲, 如果一个网站里存在了记住密码的功能, 大概率使用了该组件.

方式1:
查看响应头是否存在:
Set-Cookie: rememberMe=deleteMe![]()
![]()
存在
Set-Cookie: rememberMe=deleteMe, 确定网站使用Shiro组件.也可手工在请求包
Cookie添加rememberMe=1方式2: 使用
BurpSuite插件ShiroScan![]()
![]()
工具识别特征: 正确rememberMe字段值返回为空; 错误字段值返回
rememberMe=deleteMe
02 漏洞利用
通过对目标验证, 确认存在漏洞, 下一步动作: 漏洞利用
Shiro漏洞利用工具: ShiroAttack2
项目地址:
1 | https://github.com/SummerSec/ShiroAttack2 |


成功爆破密钥并通过
Commons-Beanutils攻击链实现RCE
03 漏洞修复与防御
- 升级 Shiro 版本到 1.2.5 及以上(密钥随机生成);
- 自定义强密钥: 在
shiro.ini或 Spring 配置中设置cipherKey为随机生成的 128/256 位密钥; - 升级依赖库: 移除或升级存在已知 gadget 的库(Commons-Collections 等);
- WAF 规则: 检测异常长的 rememberMe Cookie 值;
- 最小权限: 应用服务以低权限运行, 降低 RCE 后的危害.
1.3 SpringBoot Actuator未授权漏洞
01 基础:
Spring是java web开发常见的框架, SpringBoot是 Pivotal 团队(Spring 官方团队), 开发的快速开发框架, 基于 Spring Framework, 简而言之, SpringBoot就是一个轻量级, 简化配置和开发流程的web整合框架.
Actuator是SpringBoot框架中的功能模块, 它提供了一系列用于监控和管理SpringBoot应用程序的端点(endpoints). 这些端点可以通过HTTP, JMX(Java Management Extensions)或其他一些远程方式访问, 用于查看应用程序的各种运行时信息和健康状态.
SpringBoot Actuator未授权访问漏洞: 攻击者未进行身份验证的情况下访问敏感的管理端点, 从而获取关键应用程序信息或执行某些管理操作. 这种漏洞的存在可能导致严重的安全问题, 如: 信息泄露, 应用程序篡改或拒绝服务攻击.
02 端点信息:
SpringBoot 1.x版本默认内置路由根路径以/开始, 2.x 统一以 /actuator 开始, springboot 1.x 的Actuator Web所有端点默认开启,可直接使用. Springboot 2.xActuator Web端点只有/health和/info默认开启, 访问其它端点, 需要在配置文件application.properties中配置开启.
SpringBoot Actuator主要功能包括:
健康检查(Health Check): 提供一个用于检查应用程序健康状况的端点. 通过访问
/actuator/health端点, 可以查看应用程序是否正常运行. 它对于实时监控应用程序的健康状态和故障排查非常有用.应用程序信息(Application Information): 提供了关于应用程序的一些基本信息, 如应用程序名称, 版本号, 描述等, 通过访问
/actuator/info端点, 可以获取这些信息.环境配置信息(Environment Information): 提供了应用程序的配置属性信息. 通过访问
/actuator/env端点, 可以查看应用程序配置属性及其值.线程转储(Thread Dump): 提供了获取应用程序线程转储的端点, 通过访问
/actuator/threaddump端点, 可以查看应用程序线程当前状态, 用于分析线程问题和死锁情况.度量指标(Metrics): 提供了关于应用程序性能和资源利用的度量信息. 通过访问
/actuator/metrics端点, 可以查看请求统计, 内存使用, 垃圾回收等指标.管理端点(Management Endpoints): 除了上述常用端点外, Actuator还提供了其他管理端点, 如刷新配置, 关闭应用程序等…
重点关注:
info & health端点一般不会被认定为漏洞, 不包含有害信息;env端点若能获取到信息必定有漏洞,metrics端点可能存在接口泄露或包含Cookie & Token & JWT信息.
影响范围统计:
SpringBoot版本 默认开放端点 风险等级 < 1.x 所有端点 高危 2.0.x - 2.3.x 仅 /health 和 /info 中危 (info) ≥ 2.4.0 仅 /health 低危 SpringBoot Actuator 端点默认开放, 攻击者通过访问这些敏感管理端点, 获取关键应用程序信息或执行某些管理操作.
03 组件探测:
方式1: 通过网站图标
SpringBoot 框架网站加载默认会有如下图”树叶”图标
![]()
方式2: 通过报错页面
![]()
方式3: 通过脚本工具
工具:
dirsearch
1
uv run dirsearch.py -u "10.0.0.10" -e *
SB-Actuator (SpringBoot Actuator 未授权访问漏洞专用命令行检测工具)
项目地址:
1
https://github.com/rabbitmask/SB-Actuator
使用方式:
1
uv run SB-Actuator.py -u http://10.0.0.10:8080
04 漏洞利用
env信息脱敏利用(heapdump内存信息提取)
SpringBoot actuator 会将一些带有敏感关键词字, 例: password, secret, command的属性名对应的属性值用* 号替换达到脱敏的效果.
访问漏洞网站的
/actuator/env或env目录确认有信息泄露![]()
/actuator/env/信息泄露, 但关键信息为密文.通过访问
/actuator/heapdump下载内存数据heapdump![]()
工具提取
heapdump内存数据文件- JDumpSpider (一次性提取所有数据)
- heapdump_tool (动态读取, 自定义需要提取的值)
JDumpSpider 提取数据
1
java -jar JDumpSpider.jar heapdump > a.txt
通过
JDumpSpider将heapdump数据提取并重定向到文本文件a.txt![]()
加密属性
sun.java.command经过工具提取, 属性值成明文.
env信息脱敏利用逻辑分析:
SpringBoot脱敏只发生在”输出阶段” (写HTTP响应时)
访问
/actuator/env/时, SpringBoot会调用Sanitizer(净化器)类来序列化数据, 遍历所有PropertySource, 检查属性名的关键字如:password,secret,command,key等. 若匹配关键字, 它会用******替换该属性的value字符串, 然后再将这个被替换后的 JSON 输出给浏览器. (只读副本替换, 未修改JVM 堆内存中原有的String对象)HeapDump 抓取的是“存储阶段”(内存中的原始对象)
/actuator/heapdump端点利用 JVM 的hprof二进制格式, 将整个 JVM 堆内存(Heap)原封不动地序列化并导出为文件. 直接读取 JVM 运行时数据区的所有字节, 导出的heapdump文件中, 包含未被脱敏的原始字符串工具: 绕过输出阶段, 直接读取存储阶段的数据.
JDumpSpider 在本地运行, 完全脱离 SpringBoot 控制
工具逻辑链:
- 解析结构: 解析
.hprof文件的二进制格式, 重建出 JVM 中的对象图(Object Graph) - 定位目标: 它内置针对SpringBoot的 “爬虫规则” Spider, 专门去查找
OriginTrackedMapPropertySource,MutablePropertySources或System.getProperties()对应的Hashtable实例. - 深度遍历: 遍历这些
Map或Properties对象的Entry(键值对). 当找到键为sun.java.command的 Entry 时, 它会顺着该 Entry 的value引用, 直接读取内存中那个String对象的char[]数组. - 还原明文: 将
char[]重新编码为 Java 字符串并打印.
- 解析结构: 解析
为什么脱敏无法保护内存 ?
- 传输/展示安全:
******只保护了”网络传输” 和 “页面展示”这一瞬间. - 运行时安全: 只要程序要使用这个路径去启动 JAR 包, 那么 JVM 的类加载器(ClassLoader) 就必须持有这个字符串的明文引用.
1.4 ThinkPHP漏洞
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源轻量级PHP框架. 很多cms(内容管理系统)都是基于ThinkPHP二次开发, 所以ThinkPHP出问题, 会影响很多基于ThinkPHP开发的网站.
以下案例基于Vulhub/thinkphp/2-rce
01 框架探测
通过网站图标及其默认页面
FOFA等工具输入关键字
ThinkPHP探测![]()
02 漏洞发现
通过脚本工具
- TPscan
![]()
03 漏洞利用
自动化利用工具获取权限(LiqunKit)

工具成功发现漏洞
ThinkPHP_2-RCE

通过命令执行验证











