记录一次JWT的越权渗透测试
字数 1302 2025-08-20 18:17:58
JWT越权渗透测试实战教学文档
1. JWT基础概念
1.1 什么是JWT
JWT(Json Web Token)是目前最流行的跨域认证解决方案,由三部分组成,以点(.)分隔的Base64编码字符串:
-
Header(头部):包含令牌类型和签名算法
{ "kid": "keys/3c3c2ea1c3f213f649dc9389dd71b851", "typ": "JWT", "alg": "RS256" } -
Payload(负载):包含用户身份信息和其他声明
{ "sub": "admin" } -
Signature(签名):用于验证令牌完整性和真实性
1.2 JWT常见攻击方式
- 未校验签名:直接修改Payload部分,重新生成Token
- 禁用Hash(alg=None):将alg值改为None,绕过签名验证
- 爆破弱秘钥:使用工具爆破JWT使用的弱密钥
2. 渗透测试案例详解
2.1 系统架构分析
目标系统采用SSO(单点登录)架构:
- 初始认证:Oracle WebCenter
- 子系统认证:JWT
Oracle WebCenter是一个面向社交业务的用户参与平台,提供上下文相关的协作工具。
2.2 认证流程分析
-
初始认证阶段:
- 用户通过Oracle WebCenter进行认证
- 认证成功后返回JSON格式的Session信息
-
JWT Token获取阶段:
- 系统向OAM接口请求JWT Token
- 请求携带SessionID Cookie证明账户有效性
- OAM接口返回JWT authorizationToken
-
资源访问阶段:
- 系统自动在Header中添加JWT authorizationToken
- 服务器返回UID等敏感信息
2.3 漏洞发现过程
-
越权点定位:
- 系统未严格校验UID和JWT authorizationToken的对应关系
- 可通过遍历UID实现越权访问
-
漏洞利用步骤:
- 通过API爆破UID
- 修改请求中的UID值
- 保持JWT Token中的账户信息不变
- 获取目标用户的权限和数据
2.4 完整攻击链
- 爆破UID获取有效用户ID
- 使用有效UID和原始JWT Token构造请求
- 获取用户分组权限信息
- 获取用户未读信息
- 获取菜单信息
- 获取用户基本信息(baseinfo)
- 获取系统按钮、选项等剩余信息
3. 漏洞修复建议
-
严格校验机制:
- 校验authorizationToken、UID和user字段的一致性
- 确保三者中的用户信息匹配
-
安全增强措施:
- 实现Token与UID的绑定机制
- 增加请求来源验证
- 实施速率限制防止爆破
4. 渗透测试技巧
-
全面抓包分析:
- 不要放过任何请求和响应
- 仔细检查History中的所有记录
-
关注认证流程:
- 特别关注认证过程中的每个环节
- 注意不同认证机制之间的切换点
-
参数篡改测试:
- 尝试修改所有可能的身份标识参数
- 测试参数间的依赖关系
5. 工具推荐
6. 总结
本案例展示了JWT实现不当导致的越权漏洞,关键点在于:
- 系统未校验UID与Token的对应关系
- 认证流程中存在可绕过的环节
- 身份标识参数可被枚举
渗透测试中,细心和系统性的分析是发现此类漏洞的关键。对于JWT实现,必须确保完整的校验机制和参数绑定。