JWT安全漏洞与防护
字数 1423 2025-11-04 08:34:41
JWT安全漏洞与防护
描述
JWT(JSON Web Token)是一种用于身份验证与授权的开放标准(RFC 7519),由头部(Header)、载荷(Payload)和签名(Signature)三部分组成。其常见漏洞包括签名验证缺失、算法混淆、敏感信息泄露、密钥暴力破解等。攻击者可能利用这些漏洞伪造令牌、提升权限或窃取数据。
解题过程
-
理解JWT结构
- 头部(Header):包含令牌类型(如"JWT")和签名算法(如HS256、RS256)。示例:
{"alg":"HS256","typ":"JWT"} - 载荷(Payload):存储用户信息(如用户ID、角色)和标准声明(如过期时间)。示例:
{"sub":"123","role":"admin","exp":1630000000} - 签名(Signature):对头部和载荷的Base64编码进行签名,确保令牌完整性。公式:
签名 = HMACSHA256(Base64(头部) + "." + Base64(载荷), 密钥)
- 头部(Header):包含令牌类型(如"JWT")和签名算法(如HS256、RS256)。示例:
-
常见漏洞与攻击手法
-
漏洞1:签名验证缺失
- 问题:服务端未验证JWT签名,直接信任解码后的数据。
- 攻击:修改载荷(如将
"role":"user"改为"role":"admin")后重新组合令牌,绕过权限检查。 - 示例:原令牌
Header.Payload.Signature→ 篡改为Header.ModifiedPayload.(任意字符串)。
-
漏洞2:算法混淆攻击(Algorithm Confusion)
- 问题:服务端依赖JWT头部的
alg参数选择验证算法,但未强制限制算法类型。 - 攻击:
- 将
alg改为none(如果支持),删除签名部分(如Header.Payload.)。 - 将非对称算法(如RS256)改为对称算法(如HS256),并用公钥作为密钥伪造签名(因为服务端可能误用公钥验证HS256签名)。
- 将
- 关键点:攻击者需获取服务端公钥(通常通过公开接口暴露)。
- 问题:服务端依赖JWT头部的
-
漏洞3:敏感信息泄露
- 问题:JWT载荷仅经过Base64编码(未加密),可被直接解码查看。
- 攻击:通过Base64解码获取敏感信息(如密码、密钥ID等)。
- 示例:在线工具解码载荷部分
eyJzdWIiOiIxMjMifQ→{"sub":"123"}。
-
漏洞4:弱密钥或密钥暴力破解
- 问题:使用弱密钥(如"secret")或短密钥,易被暴力破解。
- 攻击:用常见密钥列表(如John the Ripper工具)尝试签名验证。
-
-
防护措施
- 强制签名验证:服务端必须验证签名,且拒绝无签名或无效签名的令牌。
- 固定算法:代码中强制指定验证算法(如只允许RS256),忽略JWT头部的
alg参数。# 错误示例:依赖客户端提交的alg decoded = jwt.decode(token, key, algorithms=["HS256", "RS256"]) # 正确示例:固定算法 decoded = jwt.decode(token, key, algorithms=["RS256"]) - 避免敏感信息存储:载荷中仅存储必要信息(如用户ID),敏感数据存于服务端。
- 使用强密钥:对称密钥(HS256)需足够长(≥256位);非对称算法(RS256)私钥严格保密。
- 附加防护:
- 设置短过期时间(如15分钟)。
- 使用黑名单机制吊销令牌。
- 验证标准声明(如
exp、iss)。
-
实战检测步骤
- 步骤1:用Base64解码JWT头部和载荷,检查敏感信息。
- 步骤2:修改载荷内容,发送请求观察是否被拒绝(验证签名)。
- 步骤3:尝试将
alg改为none或HS256,用公钥重签令牌。 - 步骤4:工具扫描(如jwt_tool、Burp Suite插件JWT Editor)。
通过以上分析,可系统化识别和防御JWT相关漏洞,确保身份验证机制的安全性。