JWT攻防实战:混淆、破解与红队利用技术
破解、篡改、利用——JWT不仅是令牌,更是红队的游乐场。
什么是JWT?
JWT(JSON Web Token)是一种紧凑的URL安全方法,用于在双方之间传递声明信息,主要用于无状态认证。JWT通常通过Cookie、HTTP头部或本地存储传递。
JWT包含3个Base64编码部分:
<头部>.<载荷>.<签名>
示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFlbm9zaCIsInJvbGUiOiJhZG1pbiJ9.wBwbm_z1gdu9OtUsAoOhPtUp9dJYWpA7U2oPeM4osbQj
结构解析:
- 头部:指定算法(如HS256)
- 载荷:包含用户名、角色等声明
- 签名:确保头部和载荷的完整性
JWT常用于API认证和会话管理。服务器在登录后颁发令牌,客户端在后续请求中携带该令牌。
JWT混淆技术
虽然JWT可通过Base64解码阅读,但攻击者或开发人员可能通过混淆增加复杂性或安全性。
混淆目的:
- 绕过安全控制
- 隐藏内部声明(如role=admin)
- 防止简单检查
常用混淆手法:
# Base64解码示例(仅适用于头部/载荷)
echo '<base64>' | base64 -d# 使用JWT工具包
python jwt_tool.py <token> -d
JWT破解技术
根据实现方式的不同,存在多种JWT破解方法。
HMAC密钥暴力破解(HS256)
当JWT使用弱密钥签名时:
python jwt_tool.py <token> -C -S <字典文件>
常见弱密钥:
- admin
- password123
- jwtsecret
仅适用于对称算法(HS256)且密钥可猜测的情况。
算法混淆攻击:RS256转HS256
如果JWT使用RS256(非对称)签名,但服务器未正确验证算法,可将其改为HS256并用公钥签名:
python jwt_tool.py <token> -X -pk public.pem -A HS256
public.pem文件通常以PEM格式存储公钥。CVE-2018-0114使此攻击广为人知。
none算法攻击
早期JWT库允许使用{"alg":"none"}
,并完全忽略签名。如果服务器接受此类令牌:
python jwt_tool.py <token> -S none
移除签名后重放令牌,即可实现"登录"。
声明伪造
手动修改载荷为"admin": true
,并用破解的密钥重新签名:
python jwt_tool.py <token> -E -pc 'cracked_secret' -A HS256
JWT提取与利用挑战
Cookie存储场景:
- HTTP请求中难以直接查看
- 需要BurpSuite拦截提取
- 脚本需具备Cookie容器感知能力
curl -b "auth=<jwt>" http://target.com/dashboard
本地存储场景:
- 需要XSS从浏览器窃取
- 无法通过纯服务端枚举访问
强签名防护:
- RS256配合密钥轮换
- HMAC密钥无法破解
短期有效性:
- 短有效期限制重放攻击
- 需在有效期内拦截令牌
真实靶场实践
TryHackMe: JWT实验舱
- 教授none算法攻击、弱密钥破解
- 修改载荷提升权限
- 推荐使用BurpSuite的JWT编辑器扩展
HTB: "JWT密钥"挑战
- 在JavaScript中查找泄露的密钥
- 修改令牌劫持管理员会话
自建实验环境
- 使用Node.js的jsonwebtoken库
- 设置弱密钥测试none算法绕过
防御措施:如何真正保护JWT
始终使用可信库在服务端验证令牌。
快速参考手册
# 解码JWT各部分
jwt_tool.py <token> -d# 破解密钥
jwt_tool.py <token> -C -S rockyou.txt# 尝试none算法
jwt_tool.py <token> -S none# 修改并重新签名
jwt_tool.py <token> -E -pc 'secret' -A HS256
本文原载于 https://aenosh-rajora.gitbook.io,2025年9月13日发布
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码