文章总结: 本文全面解析JWT令牌安全攻防,涵盖其三段式结构及无状态特性。重点详述识别方法与工具,深入剖析签名算法攻击、弱密钥爆破及Header注入等核心手法。文章提供了包含删除Token、越权测试等内容的实战检测清单,建议关注Token过期与敏感信息泄露,帮助安全人员系统掌握JWT漏洞挖掘与防护。 综合评分: 93 文章分类: WEB安全,渗透测试,漏洞分析,实战经验
第80天-Web攻防:JWT令牌安全攻防全解析,从入门到实战
原创
Сяо Яо Сяо Яо
AlphaNet
2026年3月11日 10:18 韩国
嗨,未来的安全大神们!👋 你是否在渗透测试中遇到过一种以
eyJ...开头的神秘字符串?这就是我们今天的主角——JWT(JSON Web Token)。它在现代Web应用中无处不在,但同时也隐藏着许多安全风险。这篇文章将带你从零开始,系统地学习JWT的“是什么-为什么-怎么做”,全面掌握其识别、检测及各种花式攻击手法!🚀
🤔 是什么:揭开JWT的神秘面纱
1. JWT到底是个啥?
JSON Web Token (JWT),简称“娇娃Token”😜,是一个开放标准(RFC 7519)。它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。简单来说,它就是一个遵循特定JSON格式的字符串,服务器通过验证这个字符串来确认你的身份。
与传统的 Cookie-Session 机制不同,JWT是 无状态的。服务器不需要在自家后院(Session存储)里为你保留个人信息,只需保管好一把“万能钥匙”(密钥)即可。当你的请求带着JWT令牌前来敲门时,服务器用钥匙一验,真伪立判。这种机制在分布式、跨服务的现代架构中备受欢迎。
2. JWT的“三段式”结构
一个标准的JWT令牌看起来像这样:
xxxxx.yyyyy.zzzzz
它由三个部分组成,每个部分都经过Base64编码,并用点(.)连接。
🔴 第一部分:标头 (Header)
这是JWT的“说明书”,一个JSON对象,用于声明加密算法(alg)和令牌类型(typ)。
{
"alg": "HS256",
"typ": "JWT"
}
-
alg: 指定签名算法,如HS256或RS256 -
typ: 固定为JWT -
有时还会有
kid、jku等扩展字段
🟡 第二部分:有效载荷 (Payload)
这是JWT的“数据舱”,用于存放用户信息。
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"role": "user"
}
说明:
-
iss:签发者 -
sub:主题 -
aud:接收方 -
exp:过期时间 -
iat:签发时间
注意:
Payload只是Base64编码,不是加密!
🔵 第三部分:签名 (Signature)
签名用于保证令牌没有被篡改。
计算方式:
Signature = HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
只要 Header 或 Payload 被修改,签名验证就会失败。
🧐 为什么:识别与检测JWT
实战中识别 JWT 很简单:
形态特征
寻找类似:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
常见位置:
-
Authorization: Bearer <token> -
Cookie
-
URL参数
-
POST请求体
解码工具
推荐使用:
https://jwt.io
可以立即解码 JWT。
🛠️ 必备武器库
Burp Suite 插件
-
Hae
-
JSON Web Tokens
-
JWT Editor
命令行工具
-
jwt_tool
-
Venom-JWT
-
jwt-secrets
-
jwt-scanner
⚔️ 怎么做:JWT核心攻击手法
1. 签名算法攻击
alg: none 攻击
攻击者将 Header 改成:
{
"alg": "none",
"typ": "JWT"
}
然后发送:
header.payload.
如果服务器没有校验算法,就会绕过认证。
算法混淆攻击(RS256 → HS256)
原理:
-
RS256:私钥签名、公钥验证
-
HS256:同一个密钥
攻击者利用 公钥作为HS256密钥。
Node.js 演示
// 攻击者利用泄露的公钥伪造管理员token
var jwt = require('jsonwebtoken');
var fs = require('fs');
// 读取公钥作为HS256密钥
var publicKeyAsSecret = fs.readFileSync('./public.key');
var token = jwt.sign(
{ user: 'admin', iat: 1672531200 },
publicKeyAsSecret,
{ algorithm: 'HS256' }
);
console.log(token);
2. 密钥安全问题
弱密钥爆破
如果密钥是:
secret
123456
admin
就可以使用工具爆破。
例如:
python3 jwt_tool.py <token> -C -d wordlist.txt
3. Header注入攻击
JWT Header 中常见字段:
kid
jku
jwk
这些字段可能引发:
-
SQL注入
-
SSRF
-
目录遍历
例如:
SELECT key FROM keys WHERE kid = '123'
如果 kid 可控,就可能注入。
目录遍历示例
kid = ../../../../dev/null
服务器可能加载错误密钥。
实战检测 Checklist
测试流程:
1 删除 JWT
删除 Authorization:
Authorization: Bearer <token>
查看是否还能访问。
2 信息泄露
解码 Payload:
jwt.io
查看是否包含:
-
用户ID
-
手机号
-
邮箱
3 Token是否过期
检查 Payload:
exp
如果没有该字段,可能 永久有效。
4 越权测试
尝试修改:
"user_id"
"role"
例如:
{
"user_id": 1,
"role": "admin"
}
5 Header注入测试
重点检查:
kid
jku
jwk
是否可以:
-
加载外部密钥
-
触发SSRF
-
触发SQL注入
📝 总结
JWT核心知识:
结构
Header.Payload.Signature
安全重点
-
Payload不是加密
-
不要存敏感信息
常见漏洞
1️⃣ alg none
2️⃣ RS256 → HS256
3️⃣ 弱密钥爆破
4️⃣ Header注入
JWT的世界远比这更广阔,但掌握以上知识,你已经超越90%的入门者。
现在那串神秘的:
eyJ...
已经不再神秘。
🤔 思考题
如果你在测试中发现:
JWT Payload 中包含用户ID
你会优先测试:
-
越权修改
-
密钥爆破
-
alg none
为什么?
欢迎在评论区分享你的思路 👇
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet Сяо Яо Сяо Яо《第80天-Web攻防:JWT令牌安全攻防全解析,从入门到实战》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论