在当今的Web应用安全领域,JSON Web Token(JWT)已成为身份认证的主流方案,但OWASP统计显示,错误配置的JWT导致的安全事件占比高达42%。本文将系统性地介绍JWT安全测试的方法论,通过真实案例剖析典型漏洞,帮助我们构建全面的JWT安全防御体系。
一、JWT基础安全测试
1. 算法验证测试
测试方法:
-
修改JWT头部的
alg
字段为none
-
尝试删除签名部分
-
使用不同算法重新签名
典型案例 :
某政务系统未校验alg
字段,攻击者将RS256改为HS256后,使用公开的公钥重新签名通过验证。正确实现应固定算法类型。
2. 密钥强度测试
测试要点:
-
检查HS256密钥长度是否≥32字节
-
验证RS256密钥长度是否≥2048位
-
测试密钥是否出现在历史版本或文档中
实例分析 :
某P2P平台使用"company@123"作为HS256密钥,被暴力破解工具在15分钟内破解。应采用加密安全的随机密钥。
二、Payload安全测试
1. 声明篡改测试
测试步骤:
-
获取普通用户JWT:
{"role":"user"}
-
修改为
{"role":"admin"}
-
不重新签名直接提交
预期结果 :
服务端应拒绝签名不匹配的Token
2. 敏感信息泄露
检查内容:
-
是否包含邮箱、手机号等PII信息
-
是否存在密码哈希或安全答案
-
是否暴露内部系统信息
真实案例 :
某医疗平台JWT包含患者身份证号,违反GDPR规定。应仅存储用户ID等引用信息。
三、签名验证测试
1. 签名绕过技术
测试矩阵:
攻击方式 | 测试方法 | 防御措施 |
---|---|---|
空签名 | 删除签名部分 | 必须存在有效签名 |
弱算法 | 改用MD5等废弃算法 | 白名单限制可用算法 |
密钥混淆 | 用公钥作为HS256密钥 | 算法与密钥类型严格匹配 |
2. 签名时效性测试
测试场景:
-
获取有效JWT
-
服务端轮换密钥
-
验证旧签名JWT是否被拒绝
金融行业案例 :
支付宝每月轮换签名密钥,旧Token最多可续期7天,确保平滑过渡。
四、时效控制测试
1. 过期时间(exp)测试
测试步骤:
-
修改设备时间至exp之后
-
使用原JWT请求
-
恢复时间再次请求
正确行为 :
服务端应基于自身时间校验,拒绝过期Token
2. 生效时间(nbf)测试
测试方法:
-
设置nbf为未来时间
-
尝试提前使用
-
到达nbf时间后验证
物联网应用案例 :
智能家居设备预置nbf为激活日期,防止出厂前被恶意使用。
五、安全头与传输测试
1. 传输安全测试
必须验证:
-
是否仅通过HTTPS传输
-
是否出现在URL参数中
-
是否被写入浏览器历史记录
渗透案例 :
某电商将JWT放在/api?token=xxx
导致搜索引擎收录泄露。应使用Authorization头。
2. 存储安全测试
测试要点:
-
Web应用是否使用HttpOnly Cookie
-
移动端是否使用安全存储(Secure Enclave)
-
是否存在XSS窃取风险
六、高级安全测试
1. 密钥注入测试
测试方法:
-
尝试使用空密钥
-
测试常见默认密钥(如"secret")
-
检查密钥轮换漏洞
JWT工具支持 :
使用jwt_tool进行自动化密钥爆破测试
2. 标头参数注入
测试参数:
-
jku
(JWK Set URL):指向恶意公钥 -
kid
:密钥标识注入(SQLi/XSS) -
x5u
:伪造证书链
防御方案 :
严格白名单控制外部引用
七、测试工具与流程
1. 推荐测试工具
-
jwt_tool:自动化漏洞扫描
-
Burp Suite:拦截修改请求
-
Postman:构造异常JWT
-
OWASP ZAP:自动化安全扫描
2. 测试流程示例

八、总结------构建JWT的深度防御
有效的JWT安全防护需要:
-
全生命周期测试:生成→传输→验证→销毁
-
自动化巡检:纳入CI/CD流水线
-
实时监控:异常JWT使用告警
-
持续教育:开发团队安全培训
通过系统化的安全测试,我们能够充分发挥JWT的优势,在便利性和安全性之间找到最佳平衡点。