【JWT漏洞】
一、JWT 基础概念
-
定义与用途:JWT是一种用于网络认证和信息安全传输的开放标准,由头部、载荷和签名三部分组成,具有体积小、无状态、适合分布式系统等优势。
-
结构剖析:包含三要素:
-
Header:定义令牌类型和签名算法。
-
Payload:存储实际传递的数据。
-
Signature:用于验证令牌完整性和真实性。
-
二、JWT攻击与防御
攻击类型 | 攻击原理 | 检测方法 |
---|---|---|
算法篡改 | 将算法改为 | 修改算法字段重放请求,观察是否验证通过 |
密钥破解 | 对弱密钥进行暴力破解,获取后伪造合法签名 | 使用常用密钥字典进行离线破解尝试 |
敏感信息泄露 | JWT的Payload部分仅经过Base64编码,可被直接解码查看 | 使用jwt.io等工具解码,检查是否包含密码等敏感信息 |
未授权访问 | 系统未正确验证Token有效性或过期时间 | 删除Token或使用过期Token访问,观察是否仍能正常响应 |
三、JWT安全实践
-
使用强密钥:采用随机生成的复杂密钥,并严格管理访问权限。
-
限制有效期:为JWT设置较短的有效期,并定期刷新。
-
强制HTTPS:确保JWT在传输过程中始终被加密。
-
算法校验:服务器端应强制验证签名算法是否符合预期。
四、关键检测流程
-
信息收集
-
使用jwt.io解码Token,分析Header和Payload内容。
-
重点检查
alg
(算法)、exp
(过期时间)、kid
(密钥ID)等字段。
-
-
漏洞探测
-
权限控制测试:删除Token,重放请求,测试未授权访问。
-
时效性测试:使用过期的Token(检查
exp
字段)访问,验证是否仍有效。 -
算法混淆测试:尝试修改算法为
none
或非对称算法,测试签名验证是否严格。
-
-
深入利用
-
密钥爆破:对弱签名进行离线暴力破解。
-
参数注入:尝试对
kid
等参数进行路径遍历或SQL注入测试。
-
五、实战
登录JWT靶场https://authlab.digi.ninja/Leaky_JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6ImFkbWluIiwicGFzc3dvcmQiOiIyYWM5Y2I3ZGMwMmIzYzAwODNlYjcwODk4ZTU0OWI2MyIsInVzZXJuYW1lIjoiam9lIn0.6j3NrK-0C7K8gmaWeB9CCyZuQKfvVEAl4KhitRN2p5k#去掉.前.后
eyJsZXZlbCI6ImFkbWluIiwicGFzc3dvcmQiOiIyYWM5Y2I3ZGMwMmIzYzAwODNlYjcwODk4ZTU0OWI2MyIsInVzZXJuYW1lIjoiam9lIn0
64明文然后得到password的MD5加密,继续转换,就得到用户名和密码了
下一个
JWT通常由头部(Header)、载荷(Payload)和签名(Signature)三部分组成,签名用于验证令牌的完整性。某些JWT解析器存在一个漏洞:允许将算法(alg)设置为“none”,从而禁用签名验证。这意味着攻击者可以伪造任意令牌,而无需知道密钥。
JWT令牌的格式为:Base64URL(Header).Base64URL(Payload).Signature
。对于“none”算法,签名部分应为空。
解密出来把HS256改为None,再一起加密
中间段同样操作,解密把用户名和密码改成你想要的,在加密粘贴上去payload
用JWT解析器的缺陷,通过将算法设置为“none”绕过签名验证。操作关键是正确构造头部和载荷,并进行Base64URL编码。
从这里看到已经绕过认证。