ワンクリックで
jwt-weakness
JWT 弱密钥与信息泄露检测 — 检测 JWT 算法配置、密钥强度与敏感 claims 暴露;适用于登录认证、API 网关与单点登录场景。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
JWT 弱密钥与信息泄露检测 — 检测 JWT 算法配置、密钥强度与敏感 claims 暴露;适用于登录认证、API 网关与单点登录场景。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
白盒建模——一次深度建模产出五张共享模型:项目架构(技术栈/分层/框架自有封装/闭源依赖位置)、 入口点(路由/中间件信任边界)、认证与权限(会话/角色/多租户/归属字段)、业务(实体/流程状态机/ 业务不变量/高价值资产)、全局威胁(攻击面×漏洞类别的适用性映射,供下游逐一全测)。本能力不做漏洞判定,为后续 漏洞维度分析建立共享底图。
OS 命令注入综合检测——覆盖直接命令拼接 / shell 元字符 / 参数注入 / 间接 RCE,按回显 / 时间 / 带外通道分诊。 流量中参数值含主机名 / URL / 文件名 / 命令片段、响应里出现 shell 错误关键字(`/bin/sh` / `cmd.exe` / `command not found`)、注入 `sleep N` 耗时增加、上传后异步处理链路时使用。
文件上传多策略综合检测——覆盖扩展名 / MIME / 魔术数 / 解析漏洞 / 上传链组合(LFI / Zip Slip / SVG XSS / SVG XXE)。 流量含 multipart/form-data 上传、响应回显落盘路径、上传后文件可被 GET 解析、上传字段含 filename / path 可控时使用。
IDOR 水平越权检测 — 通过替换资源标识符(ID/UUID/路径)访问他人资源的风险;适用于用户资料、订单、文档、租户隔离场景。
检测路径穿越和本地文件包含(LFI)风险;当目标存在文件读取/下载/预览功能且含路径参数时触发;适用于文件下载、日志查看、模板加载等场景。
黑盒建模 — 迭代式攻击面建模,按站点级 / 页面级 / 功能级三粒度推进;进入新页面即触发一次页面级建模、切换新身份各刷新一次,产出端点账本与页面语义模型,为后续漏洞维度的适用性判断提供依据。
| name | jwt-weakness |
| description | JWT 弱密钥与信息泄露检测 — 检测 JWT 算法配置、密钥强度与敏感 claims 暴露;适用于登录认证、API 网关与单点登录场景。 |
| when-to-use | 当任务涉及鉴权令牌安全、JWT 签名校验与 token 泄露风险评估时 |
| allowed-tools | bash,read_file,list_files,rg |
| user-invocable | false |
JWT Token / 凭证字符串(用户可控的签名与 claim 载荷)→ JWT 验证逻辑(服务端 HMAC 密钥校验 / 算法决策 / claim 信任 / 过期判定)= JWT 弱密钥与信任滥用类漏洞。一句话讲清成因:服务端把"客户端递交的 token 当作可信凭证",签名校验、算法选择与 claim 信任任一环失守,攻击者就能伪造或重放越权 token。业务命名不可作筛选——不能用"这是登录接口/这是网关 token/这个字段叫 access_token"作为是否检测的依据,是否存在 JWT 弱点要按 sink 语义(签名校验代码路径、算法白名单逻辑、claim 信任面、过期判定)判断;同一系统里 SSO 网关 token、刷新 token、设备 token 完全可能采用不同密钥与不同算法。详见同根目录 pentest/web-security-testing/SKILL.md 漏洞成因图谱 · JWT 弱密钥与信任滥用行(不在本 skill 重复成因)。
以下是已知的常见 JWT 弱密钥与信息泄露触发线索,作为基线起点而非必检硬清单:
[x] done[-] n/a (原因)[+] added (来源)基线触发线索按"sink 语义"分类(不按业务命名):
eyJ 开头的三段式字符串;Authorization: Bearer <jwt>;Cookie 名为 token / access_token / id_token / session 且值为 JWT 形态;前端 localStorage / sessionStorage 写入 JWT。alg=HS256/HS384/HS512 且无密钥强度声明;alg=none 仍被接受;同时存在 RS256 公钥可读端点(.well-known/jwks.json、/oauth/keys)且服务端未锁定算法白名单。role / isAdmin / scope / tenant_id / user_id 等权限判定字段;payload 含明文敏感数据(手机号、邮箱、身份证、内部 ID、API key 片段);iss / aud 字段未在服务端校验。exp / nbf / iat 字段存在但服务端是否拒收过期 token 未知;登出后旧 token 是否仍被接受未知;无 jti / 黑名单机制。jwt.parse(token)、jwt.decode(token, verify=False)、new JwtParser().setSigningKey(...).parseClaimsJws(...) 等"签名校验或解码"形态;密钥来源为常量字符串、配置文件明文、环境变量但默认值为弱口令。加载本 skill 时按这些问题思考:
alg?jwt.secrets.txt 或同等规模),不进行高强度暴力尝试。提取请求中的 Authorization header / Cookie / body / 前端存储中的 JWT;记录采集位置(哪个端点的请求/响应)以便后续端点矩阵传播登记。
调用 jwt_decode 做无签名校验解码,记录:
alg、密钥 ID kidexp / nbf / iatsub / role / scope / tenant_id / isAdmin / iss / aud)若为 HMAC 算法(HS256/HS384/HS512):
key 解密;jwt_crack 并按需开启内置字典批量验证(use_builtin_wordlist=true)。非 HMAC 算法(RS256/ES256):
alg=RS256 改成 alg=HS256,把公钥当 HMAC 密钥使用是否被服务端接受。alg=none 是否被接受(移除签名段)。将命中的密钥或绕过形态用于伪造一个新 token(最小化篡改,如把 role=user 改为 role=admin),重发到受保护端点;观察服务端是否真的据此放权。仅能解码或能签出新 token 但服务端未接受,不能判 confirmed。
jwt.parse(token).getBody()(无算法白名单约束)— 服务端未限制算法,攻击者可改 alg=none 绕过签名(jwt-alg-none-accepted)new JwtParser().setSigningKey(publicKeyPem).parseClaimsJws(token)(同时支持 RS256 与 HS256)— 经典 RS256→HS256 算法混淆(jwt-rs256-to-hs256-confusion)application.yml 中 jwt.secret: secret123 — 硬编码弱密钥(jwt-hs256-weak-secret-bruteforce)claims.get("role") 直接用于权限判定且无服务端二次校验 — claim 篡改无防护(jwt-claim-tampering-no-verify)以下是 JWT 弱密钥与信息泄露维度的典型窄化误判:
alg=none、RS256→HS256 混淆是三个独立的 sink 语义形态,密钥强度判定不能替代算法决策面的覆盖。exp 字段 → 已防过期" — 错。exp 是 claim 声明,需要服务端实际验证;很多实现只解码不校验时间,必须用过期 token 重放确认服务端是否拒收。token / jwt 就跳过" — 错。按 sink 语义(任何三段式 Base64URL 形态、任何被服务端当作签名凭证使用的字符串)筛选,不按命名筛选。为什么这里是「必须」:反例义务属于交付契约——"该子系统无 JWT 弱点"或"已防护"结论是覆盖完整性的产物声明,缺失反向验证清单会让下游误信"该维度全站安全"。
写"未发现 JWT 弱点"或"已防护"前,产物必须包含:
alg=none、RS256↔HS256 混淆、claim 篡改、过期重放清单不完整 → 结论降级为 partial-coverage 并显式声明未覆盖范围。
特别警示:最容易漏的是"算法决策面跨签发模块差异"——主登录走 RS256 强密钥,刷新 token 走 HS256 弱密钥;只看一处会直接判全站安全。每个独立签发模块都要单独跑一遍弱密钥与算法混淆。
通用闭环口径见同根目录 common/closure-verification.md(技能表 path 列同一抽取根下,需要时 read_file 读取)。核心:完整证据链才判 confirmed,中间信号最多 suspected。本漏洞特有要点:
jwt_crack 命中弱密钥、仅能离线伪造 token——属中间信号,需进一步把伪造 token 发到受保护端点并观察服务端放权才能 confirmed。alg=none 必须用伪造后的 token 实际请求受保护资源,仅能成功签名不算闭环。| 现象 | 判定 |
|---|---|
jwt_crack 明确命中 HMAC 签名密钥,且据此最小化伪造/篡改 token 后被服务端接受并放权 | confirmed |
alg=none / 算法混淆 / claim 篡改后的 token 被服务端接受并放权 | confirmed |
| 命中弱密钥但未验证受保护资源接受;或 claims 暴露不必要敏感信息但影响范围未确认 | suspected |
| 算法与内容均无明显问题,且未出现弱密钥命中证据 | not vulnerable |
| 覆盖清单不完整(如未跨签发模块测算法混淆/未测 alg=none) | partial-coverage |
alg。alg=none;接收端始终用对应算法的密钥校验,杜绝 RS256/HS256 混淆。exp/nbf/iss/aud,服务端实现 token 撤销(黑名单 / 短 TTL + 刷新机制)。