一文学习JWT造成的各种安全漏洞利用手法(二)
字数 1396 2025-08-29 08:30:13

JWT安全漏洞利用手法详解(二)

一、无密钥算法混淆攻击

漏洞原理

当服务器不验证JWT签名算法时,攻击者可以将算法从非对称加密(如RS256)改为对称加密(如HS256),利用服务器公钥作为HMAC密钥伪造令牌。

利用步骤

  1. 获取两个不同会话的JWT令牌
  2. 使用工具(如jwt_tool)分析令牌:
    python3 jwt_tool.py <JWT1> -C -d <JWT2>
    
  3. 尝试将算法从RS256改为HS256
  4. 使用服务器公钥作为HMAC密钥重新签名
  5. 修改payload中的权限字段(如将sub改为admin)
  6. 使用伪造的令牌访问系统

二、JWK头部注入攻击

漏洞基础

  • JWK(JSON Web Key)是JWS规范中允许的头部字段
  • 漏洞发生在服务器信任JWT中嵌入的公钥而不验证其来源时
  • 攻击者可自建RSA密钥对,用自己的私钥签名,在头部嵌入对应的公钥

利用步骤

  1. 使用工具生成RSA密钥对(如Burp JWT Editor插件)
  2. 获取正常JWT令牌
  3. 修改payload中的权限字段
  4. 在头部添加jwk参数,包含攻击者公钥
  5. 使用攻击者私钥重新签名
  6. 发送伪造的JWT访问特权接口

三、JKU头部注入攻击

漏洞基础

  • JKU(JSON Web Key Set URL)指向存储公钥的URL
  • 服务器可能不验证JKU指向的域名是否可信
  • 攻击者可托管恶意JWK Set,在JKU中指向自己的服务器

利用步骤

  1. 搭建恶意服务器托管JWK Set(包含攻击者公钥)
  2. 获取正常JWT令牌
  3. 修改payload中的权限字段
  4. 在头部添加jku参数,指向恶意URL
  5. 确保kid与远程JWK Set中的一致
  6. 使用攻击者私钥重新签名
  7. 发送伪造的JWT访问特权接口

四、KID头部注入攻击

漏洞基础

  • KID(Key ID)没有严格格式要求
  • 服务器可能使用kid值作为文件路径获取密钥
  • 特殊文件如/dev/null(空文件)可被利用

利用步骤(路径遍历)

  1. 获取正常JWT令牌
  2. 修改头部:
    • 设置alg为HS256
    • 设置kid为"../../../dev/null"
  3. 使用空密钥("")进行HMAC签名
  4. 发送伪造的JWT绕过验证

五、敏感信息泄露

漏洞原理

  • JWT payload部分仅Base64编码,可被轻易解码
  • 开发者可能在payload中存储敏感信息(密码、密钥等)

利用步骤

  1. 获取JWT令牌
  2. Base64解码payload部分:
    echo "<payload>" | base64 -d
    
  3. 检查泄露的敏感信息(如密码可能是哈希值)
  4. 尝试破解哈希(如MD5)
  5. 使用泄露凭证登录系统

六、密钥硬编码漏洞

典型案例:Nacos JWT漏洞

  • Nacos使用JWT进行身份认证
  • 配置文件中存在默认签名密钥(如"SecretKey012345678901234567890123456789012345678901234567890123456789")
  • 开发者未更改默认密钥导致可伪造JWT

利用步骤

  1. 识别系统使用JWT认证
  2. 查找公开的默认密钥(文档、GitHub等)
  3. 使用默认密钥伪造高权限JWT
  4. 绕过身份认证访问管理接口

防御措施

  1. 严格验证JWT签名算法,禁止算法降级
  2. 不信任客户端提供的jwk/jku,使用预定义的白名单密钥
  3. 对kid参数进行严格校验,防止路径遍历
  4. 不在JWT payload中存储敏感信息
  5. 不使用默认/弱密钥,定期轮换密钥
  6. 实现完整的JWT验证逻辑(过期时间、签发者等)

以上技术仅供安全研究和授权测试使用,未经授权测试他人系统可能违反法律。

JWT安全漏洞利用手法详解(二) 一、无密钥算法混淆攻击 漏洞原理 当服务器不验证JWT签名算法时,攻击者可以将算法从非对称加密(如RS256)改为对称加密(如HS256),利用服务器公钥作为HMAC密钥伪造令牌。 利用步骤 获取两个不同会话的JWT令牌 使用工具(如jwt_ tool)分析令牌: 尝试将算法从RS256改为HS256 使用服务器公钥作为HMAC密钥重新签名 修改payload中的权限字段(如将sub改为admin) 使用伪造的令牌访问系统 二、JWK头部注入攻击 漏洞基础 JWK(JSON Web Key)是JWS规范中允许的头部字段 漏洞发生在服务器信任JWT中嵌入的公钥而不验证其来源时 攻击者可自建RSA密钥对,用自己的私钥签名,在头部嵌入对应的公钥 利用步骤 使用工具生成RSA密钥对(如Burp JWT Editor插件) 获取正常JWT令牌 修改payload中的权限字段 在头部添加jwk参数,包含攻击者公钥 使用攻击者私钥重新签名 发送伪造的JWT访问特权接口 三、JKU头部注入攻击 漏洞基础 JKU(JSON Web Key Set URL)指向存储公钥的URL 服务器可能不验证JKU指向的域名是否可信 攻击者可托管恶意JWK Set,在JKU中指向自己的服务器 利用步骤 搭建恶意服务器托管JWK Set(包含攻击者公钥) 获取正常JWT令牌 修改payload中的权限字段 在头部添加jku参数,指向恶意URL 确保kid与远程JWK Set中的一致 使用攻击者私钥重新签名 发送伪造的JWT访问特权接口 四、KID头部注入攻击 漏洞基础 KID(Key ID)没有严格格式要求 服务器可能使用kid值作为文件路径获取密钥 特殊文件如/dev/null(空文件)可被利用 利用步骤(路径遍历) 获取正常JWT令牌 修改头部: 设置alg为HS256 设置kid为"../../../dev/null" 使用空密钥("")进行HMAC签名 发送伪造的JWT绕过验证 五、敏感信息泄露 漏洞原理 JWT payload部分仅Base64编码,可被轻易解码 开发者可能在payload中存储敏感信息(密码、密钥等) 利用步骤 获取JWT令牌 Base64解码payload部分: 检查泄露的敏感信息(如密码可能是哈希值) 尝试破解哈希(如MD5) 使用泄露凭证登录系统 六、密钥硬编码漏洞 典型案例:Nacos JWT漏洞 Nacos使用JWT进行身份认证 配置文件中存在默认签名密钥(如"SecretKey012345678901234567890123456789012345678901234567890123456789") 开发者未更改默认密钥导致可伪造JWT 利用步骤 识别系统使用JWT认证 查找公开的默认密钥(文档、GitHub等) 使用默认密钥伪造高权限JWT 绕过身份认证访问管理接口 防御措施 严格验证JWT签名算法,禁止算法降级 不信任客户端提供的jwk/jku,使用预定义的白名单密钥 对kid参数进行严格校验,防止路径遍历 不在JWT payload中存储敏感信息 不使用默认/弱密钥,定期轮换密钥 实现完整的JWT验证逻辑(过期时间、签发者等) 以上技术仅供安全研究和授权测试使用,未经授权测试他人系统可能违反法律。