chawdamrunal/JWTLens

GitHub: chawdamrunal/JWTLens

一款 Burp Suite 扩展,通过 62 项自动化安全检查和内置 JWT 编辑器,全面检测 JSON Web Token 的签名绕过、算法混淆、密钥泄露等安全漏洞。

Stars: 1 | Forks: 0

# JWTLens **适用于 Burp Suite 的全面 JWT 安全扫描器** JWTLens 是一款 Burp Suite 扩展,可自动检测并测试 JSON Web Token (JWT) 的安全漏洞。它执行 **56 项安全检查**,覆盖完整的 JWT 攻击面——从对 token 配置的被动分析,到主动利用签名绕过、算法混淆、header 注入等。 ![a-modern-vector-style-logo-banner-featur_fq0GVcNLQw-JF3kfVY4Rww__0gZEU7xRAml4RnpKeJk0w_sd](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b959c975f8064756.jpg) JWTLens 在 Burp Suite 顶部栏中添加了两个专用标签页:**JWTLens**(发现结果仪表板)和 **JWT Forge**(实时 token 编辑器和签名器)。它还会从 JavaScript 文件和 API 响应中被动提取 secrets 和 keys,以增强其主动攻击能力。 ![JWTLens — Burp site map with JWT findings](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/f15d8c5f28064758.png) ## 为什么选择 JWTLens? 大多数 JWT 测试工具要么需要手动操作,要么只覆盖少数几项检查。JWTLens 在您浏览时自动在后台运行,一旦 JWT 出现在您的代理流量中,就能立即捕获其配置错误。当您需要深入检测时,只需右键单击,主动扫描器就会针对服务器测试每一个已知的 JWT 攻击向量。 与现有的 JWT 扩展相比,JWTLens 增加了: - 完整的被动扫描(其他扩展均不具备此功能) - **JWT Forge 标签页** — 一个内置于 Burp 中的实时 jwt.io 风格编辑器,具备签名功能 - **Secret Extractor** — 被动发现 JS/JSON/HTML 响应中硬编码的 secrets 和 keys - **正确的 JWKS 解析** — 获取真实的服务器公钥用于算法混淆攻击 - **请求 + 响应扫描** — 暴力破解和所有操作适用于任何位置的 JWT,而不仅仅是请求中 - 支持自定义字典的弱密钥暴力破解(由提取的 secrets 进行增强) - KID 注入测试(SQL 注入、命令注入、LDAP 注入、包含 10+ 条路径的路径遍历) - x5u 和 x5c header 注入 - 用于权限提升的 Claim 篡改 - 智能去重以避免重复的发现结果 - 内置发现结果仪表板,支持 CSV 导出 ## 主要功能 ### JWT Forge 标签页 一个专用的 Burp 标签页,功能类似 jwt.io,但具备真实的攻击能力: - **粘贴任意 JWT** — 即时解码为可编辑的 header 和 payload JSON,并带有语法着色 - **算法选择器** — 在 none, HS256, HS384, HS512, RS256, RS384, RS512 之间切换 - **Sign Token** — 使用您选择的算法和 secret/key 对编辑后的 token 重新签名 - **Use Discovered Secret** — 一键自动填充通过暴力破解或 Secret Extractor 发现的 secrets - **Copy as cURL** — 生成一个可直接粘贴的 `curl` 命令,将伪造的 token 作为 Bearer header - **Copy as Python** — 生成一个包含伪造 token 的 Python `requests` 脚本 - **Send to Forge** — 右键单击 Proxy/Repeater 中的任何请求,将其 JWT 直接发送到 Forge 标签页 - 当暴力破解破解出一个 secret 时,token 和 secret 会**自动加载**到 Forge 中,以便立即重新签名 ### Secret Extractor(被动) 自动对流经 Burp Proxy 的每个 JS、JSON、HTML 和文本响应运行: - **硬编码 JWT secrets** — 检测 JS、JSON、.env 和 YAML 模式中的赋值,如 `JWT_SECRET = "..."`, `"jwtSecret": "..."`, `JWT_SECRET=value` - **RSA/EC 私钥** — 检测响应中暴露的 PEM 格式私钥 - **RSA 公钥** — 提取并存储,用于算法混淆攻击 - **内联 JWKS** — 检测响应中嵌入的 `{"keys":[...]}` 结构 - **JWKS URL 引用** — 发现 `jwks_uri`, `jwks_url` 及类似引用,供主动扫描器跟踪 - **Base64 编码的 secrets** — 解码 `atob("...")` 和 `Buffer.from("...")` 模式 - **误报过滤** — 忽略模板变量(`${...}`)、常见占位符值和通用词汇 - 发现的 secrets 会**自动添加**到暴力破解字典的开头(最先测试,优先级最高) - 发现的公钥会**自动输入**到算法混淆攻击(A07)中 - 所有发现都会作为结果**报告**在 JWTLens 标签页中,并附带严重等级 ### 针对算法混淆的正确 JWKS 解析(A07) 算法混淆攻击(RS256 到 HS256)现在使用**服务器的实际公钥**,而不是生成的密钥: - **阶段 1** — 从知名端点(`/.well-known/jwks.json`, `/jwks.json` 等)获取 JWKS - **阶段 2** — 如果未找到直接 JWKS,则跟踪 OpenID Configuration 中的 `jwks_uri` - **阶段 3** — 使用 Secret Extractor 从 JS/响应体中发现的公钥 - **阶段 4** — 测试每个真实密钥(包括 DER 和 PEM 编码)作为 HMAC secret - **阶段 5** — 仅在找不到真实密钥时才回退到生成的密钥对 - **智能密钥选择** — 按 token 的 `kid` 匹配,然后按 `use=sig`,再按 `alg=RS*` - 正确的 JWK 解析从 `n` 和 `e` Base64url 值重建 `RSAPublicKey` 对象 - 这意味着该攻击**确实适用于真实目标**,而在以前通常会失败 ### 请求 + 响应 JWT 提取 所有上下文菜单操作现在都会搜索**请求和响应**中的 JWT: - **Brute Force** — 从响应体中查找并破解 JWT(例如,登录端点、配置 API) - **Send to Forge** — 适用于任何位置的 JWT - **Decode JWT** — 解码在请求和响应中找到的所有 JWT,并标记其来源 - **Multi-JWT picker** — 当发现多个 JWT 时(例如,一个在请求 header 中,一个在响应体中),一个对话框允许您选择要操作的那个 - 每个 JWT 都标记为 `[Request]` 或 `[Response]`,因此您始终知道它来自何处 ## JWTLens 覆盖范围 — 56 项安全检查 ### 被动检查(23 项检查,不发送请求) 这些检查自动对流经 Burp Proxy 的每个请求和响应运行。 **Token 检测与泄露** - **P01** — HTTP 流量中检测到 JWT *(Info)* - **P02** — JWT 暴露在 URL 查询参数中 *(Medium)* - **P03** — JWT 暴露在 URL 片段中 *(Medium)* - **P14** — JWT 泄露在 HTTP 响应体中 *(Medium)* **Cookie 安全性** - **P04** — JWT cookie 缺少 HttpOnly 标志 *(Medium)* - **P05** — JWT cookie 缺少 Secure 标志 *(Medium)* - **P06** — JWT cookie 缺少 SameSite 属性 *(Low)* **Token 生命周期** - **P07** — JWT 缺少过期时间 声明 *(High)* - **P08** — JWT 生命周期过长(可配置阈值) *(Low)* - **P10** — 过期的 JWT 仍在请求中发送 *(Info)* **Claim 验证** - **P11** — 缺少签发者 声明 *(Low)* - **P12** — 缺少受众 声明 *(Low)* - **P22** — 缺少生效时间 声明 *(Info)* - **P23** — 缺少唯一标识符 声明 *(Info)* **敏感数据与结构** - **P09** — JWT payload 中包含敏感数据(电子邮件、密码、SSN、信用卡、API 密钥) *(Medium)* - **P13** — 检测到对称算法(暴力破解建议) *(Info)* - **P20** — payload 中检测到嵌套 JWT *(Info)* **危险的 Header 参数** - **P15** — kid (Key ID) 参数存在 *(Info)* - **P16** — jku (JWKS URL) 参数存在 *(Low)* - **P17** — x5u (X.509 Certificate URL) 参数存在 *(Low)* - **P18** — x5c (X.509 Certificate Chain) 参数存在 *(Low)* - **P19** — jwk (Embedded JSON Web Key) 参数存在 *(Low)* - **P21** — 弱签名算法或已弃用的签名算法 *(Medium)* **Secret 提取(被动)** - **S01** — 从 JS/JSON/HTML 响应中提取出 JWT 签名 secret *(High)* - **S02** — RSA/EC 私钥暴露在 HTTP 响应中 *(High)* - **S03** — HTTP 响应中发现 RSA 公钥 *(Low)* - **S04** — 响应中发现内联 JWKS *(Low)* - **S05** — 响应中发现 JWKS URL 引用 *(Info)* - **S06** — 从响应中解码出 Base64 编码的 secret *(High)* ### 主动检查(33 项检查,发送修改后的请求) 这些检查在主动扫描期间或通过右键菜单手动触发时运行。 **签名绕过** - **A01** — Algorithm None 攻击("none" 的所有 16 种大小写排列组合) *(High)* - **A02** — 接受无效签名(未强制执行签名验证) *(High)* - **A03** — 签名剥离(接受空签名) *(High)* - **A23** — 接受 Null 签名字节 *(High)* - **A28** — 接受未经重新签名的 Payload 修改 *(High)* **弱密钥** - **A05** — 接受空密钥(使用空密码的 HMAC) *(High)* - **A06** — 弱 secret 暴力破解(200+ 内置 + 提取的 secrets,支持自定义字典) *(High)* - **A26** — 检测到弱 RSA 密钥大小(模数小于 2048 位) *(High)* **算法攻击** - **A07** — 算法混淆 RS256 到 HS256(正确的 JWKS 解析,使用服务器的真实公钥) *(High)* - **A22** — 跨算法签名(HS384, HS512 使用空密钥或已知密钥) *(High)* - **A25** — 使用伪造公钥的算法混淆 (Sign2n) *(High)* **Header 注入** - **A08** — JWK header 注入(自签名密钥嵌入 token) *(High)* - **A09** — JKU header 注入(攻击者控制的 JWKS URL) *(High)* - **A10** — JKU SSRF pingback(服务器向攻击者 URL 发出出站请求) *(Medium)* - **A11** — X5U header 注入(攻击者控制的证书 URL) *(High)* - **A12** — X5C header 注入(自签名证书嵌入 token) *(High)* **KID 注入** - **A13** — KID 路径遍历(10+ 遍历路径,包括 /dev/null, /etc/hostname) *(High)* - **A14** — KID SQL 注入(UNION SELECT, OR bypass, error-based) *(High)* - **A15** — KID 命令注入(基于时间的检测,使用 sleep payloads) *(High)* - **A16** — KID LDAP 注入(通配符和过滤器操作) *(High)* **Token 生命周期和 Claims** - **A04** — 服务器接受过期 JWT *(High)* - **A17** — 未强制执行生效时间 声明 *(Medium)* - **A18** — 用于权限提升的 Claim 篡改(admin, role, sub 操作) *(High)* - **A19** — 主体声明枚举(用户 ID 发现) *(Medium)* - **A24** — 在合理的时钟偏差容限之外接受 Token *(Medium)* **CVE 和加密问题** - **A20** — CVE-2022-21449 Psychic Signatures(Java ECDSA 零值绕过) *(High)* - **A21** — ECDSA 签名可塑性 *(Low)* **侦察与逻辑** - **A27** — JWKS 端发现(知名路径) *(Info)* - **A29** — 接受 typ header 操作 *(Low)* - **A30** — 端点间的 Token 混淆(跨服务重放) *(Medium)* - **A31** — 注销后 Token 仍然有效 *(Medium)* - **A32** — 密码更改后 Token 仍然有效 *(Medium)* - **A33** — 通过知名路径覆盖进行 JWKS 欺骗 *(High)* ### 覆盖范围摘要 - **被动检查:** 23 + 6 项 Secret 提取检查 - **主动检查:** 33 - **总计:** 62 - **高危:** 31 - **中危:** 14 - **低危:** 10 - **信息:** 7 ## 安装 ### 前置条件 您需要 Java 17 或更高版本,以及 Burp Suite Professional 或 Community Edition(2024.1 或更高版本,需支持 Montoya API)。 ### 从源码构建 ``` git clone https://github.com/AadityaKGupta/JWTLens.git cd JWTLens/jwtlens-burp ./gradlew clean jar ``` 构建好的 JAR 文件将位于 `build/libs/jwtlens-1.0.0.jar`。 ### 在 Burp Suite 中安装 1. 打开 Burp Suite 2. 转到 Extensions > Installed > Add 3. 将 Extension Type 设置为 Java 4. 点击 Select File 并选择 `jwtlens-1.0.0.jar` 5. 点击 Next JWTLens 将显示为 Burp 顶部标签栏中的两个新标签页。您还将在扩展输出中看到一条确认消息: ``` ========================================= JWTLens v1.0.0 Loaded Successfully JWT Security Scanner for Burp Suite 23 Passive + 33 Active = 56 Checks + JWT Forge Tab + Secret Extractor ========================================= ``` ## 使用方法 ### 自动扫描 安装后,JWTLens 会自动工作: - **被动扫描** 对流经 Burp Proxy 的每个请求和响应运行。每当检测到 JWT 时,JWTLens 就会分析其是否存在配置错误、缺少 claims、敏感数据、cookie 安全问题等。无需您执行任何操作。 - **Secret Extractor** 与被动扫描一起,对每个 JS、JSON 和 HTML 响应运行。发现的 secrets 可立即用于主动扫描和 Forge 标签页。 - **主动扫描** 在您使用 Burp 内置的主动扫描器时运行。JWTLens 为 JWT token 注册自定义插入点,并自动测试所有主动攻击向量。 ### 手动扫描 ![JWTLens context menu — right-click to run checks, brute force, or send to Forge](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/5eb990fe7c064800.png) 右键单击 Proxy、Repeater、Intruder 或 Logger 中的任何请求,然后从 JWTLens 菜单中选择: - **Run Passive Checks** — 分析 JWT 而不发送任何请求 - **Run Full Active Scan** — 发送修改后的 JWT token 以测试所有攻击向量 - **Brute Force Secret Only** — 针对 200+ 个常见 secrets(以及任何提取的 secrets)离线测试 JWT,如果找到 secret 则显示弹出窗口。适用于请求和响应中的 JWT。 - **Send to JWT Forge** — 将 JWT 发送到 Forge 标签页进行手动编辑和重新签名 - **Decode JWT** — 将解码后的 header、payload 和 signature 打印到扩展输出 所有操作都会搜索请求和响应中的 JWT。如果发现多个 JWT,一个选择器对话框允许您选择要操作的那个。 ### JWTLens 标签页 ![JWTLens scanner tab — findings table with 35 passive + 33 active results and settings panel](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/963a0288f6064802.png) Burp 顶部栏中的 JWTLens 标签页为您提供一个集中式仪表板: - **Findings Table** — 所有 JWT 发现结果,带有可排序的列,包括严重程度、问题名称、主机、URL、置信度和时间戳。严重程度采用颜色编码(红色代表 High,橙色代表 Medium,蓝色代表 Low,灰色代表 Info)。 - **Advisory Panel** — 当您选择一个发现结果时,提供完整的问题详细信息和修复建议。内容与 Burp 的 Issues 标签页相同,但是在一个专用视图中。 - **Decoded JWT Panel** — 与所选发现结果关联的 JWT 的解码 header、payload 和 signature。 - **Scanner Settings** — 启用或禁用被动和主动扫描,配置长生命周期阈值(默认为 24 小时)。 - **Brute Force Wordlist** — 上传自定义字典文件(.txt 或 .lst,每行一个 secret)。追加到内置列表或用作替换。点击 Reset to Built-in 恢复默认设置。 - **Deduplication** — 显示跟踪的唯一 JWT 数量,以及清除缓存的按钮。JWTLens 按主机和 JWT 签名进行去重,因此跨多个端点的相同 token 只会被扫描一次。 - **Export CSV** — 将所有发现结果保存到 CSV 文件以便报告。 ### JWT Forge 标签页 ![JWT Forge tab — live token editor with discovered secret auto-filled and one-click re-signing](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2c5386f3b2064804.png) JWT Forge 标签页提供了一个完整的 token 编辑和签名工作区: - **Encoded JWT**(左)— 粘贴任何 JWT 进行解码,或查看伪造的输出 - **Header JSON**(右上方)— 带有语法着色的可编辑 JSON,实时反映更改 - **Payload JSON**(右中间)— 可编辑的 claims,修改 roles, expiry, subject 或任何 claim - **Signing panel**(左中间)— 选择算法,输入 secret/key,点击 Sign Token - **Forged Token Output**(底部)— 重新签名的 JWT,可直接复制 - **Action buttons** — Copy Forged Token, Copy as cURL, Copy as Python, Clear All Forge 标签页与 JWTLens 的其余部分集成: - 暴力破解破解出一个 secret → token + secret 自动加载到 Forge - Secret Extractor 在 JS 中发现一个 key → 可通过 "Use Discovered Secret" 按钮使用 - 右键 "Send to JWT Forge" → token 已加载以供编辑 ## 智能去重 关于 JWT 扫描器最常见的抱怨之一是,对于同一个 token,每个请求都会产生重复的发现结果。JWTLens 跟踪每个主机的唯一 JWT,并且只扫描一次。如果您在同一个网站上浏览 50 个页面,并且每个请求都带有相同的 JWT,您只会得到一组发现结果,而不是 50 组。 可以随时从 JWTLens 标签页或右键上下文菜单中清除去重缓存。 ## 自定义字典 JWTLens 附带了一个内置字典,包含 200+ 个常用的 JWT secrets,包括 jwt.io 默认值、常见密码、框架默认值以及在真实泄露中发现的各种模式。Secret Extractor 会自动使用在会话期间从 JavaScript 或 API 响应中发现的任何 secrets 来增强此列表。 要使用您自己的字典: 1. 转到 JWTLens 标签页 2. 在 Brute Force Wordlist 部分,点击 Upload Custom Wordlist 3. 选择一个文本文件,每行一个 secret(以 # 开头的行将被忽略) 4. 选择是追加到内置列表还是替换它 为了获得最大覆盖率,请使用更大的字典。GitHub 上的 jwt-secrets 项目维护着一个综合列表,或者您可以使用任何密码字典。JWTLens 首先执行离线验证(快速,无网络流量),仅在找到匹配项时才向服务器发送请求。 ## 对比 **现有的 JWT 扩展:** - 没有被动扫描 - ~16 项主动检查 - 每个请求都有重复的发现结果 - 没有弱 secret 暴力破解 - 没有 KID SQL/命令/LDAP 注入 - 没有 x5u/x5c header 注入 - 没有 Claim 篡改 - 没有 Cookie 安全检查 - 没有专用 UI 标签页,没有 CSV 导出,没有自定义字典 - 没有 JWT 编辑器和签名功能 - 没有从 JS 中提取 secret - 算法混淆使用生成的密钥(对真实目标从未成功过) - 暴力破解仅适用于请求中的 JWT **JWTLens:** - 23 项被动检查 + 6 项 secret 提取检查自动运行 - 33 项主动检查 - 总共 62 项检查 - 智能主机 + JWT 去重 - 200+ 内置 secrets + 提取的 secrets + 自定义字典支持 - KID SQL 注入(UNION SELECT, error-based)、命令注入、LDAP 注入 - 完整的 x5u 和 x5c header 注入支持 - Role, admin, sub claim 操作 - HttpOnly, Secure, SameSite cookie 检查 - 完整的仪表板,包含发现结果、解码后的 JWT、配置 - 一键 CSV 导出 - 从 UI 上传和管理自定义字典 - JWT Forge 标签页,支持实时编辑、签名、cURL/Python 导出 - 从 JS, JSON, HTML 响应中被动提取 secret - 正确的 JWKS 解析,使用真实服务器密钥进行算法混淆 - 暴力破解和所有操作适用于请求和响应中的 JWT - 发现多个 token 时的 Multi-JWT picker ## 测试 JWTLens 要查看 JWTLens 在最大发现结果下的实际效果,请针对有意设计的易受攻击应用程序进行测试: - **PortSwigger JWT Labs** — 有 8 个免费实验室,涵盖未验证签名、algorithm none、弱密钥、JWK 注入、JKU 注入、KID 路径遍历和算法混淆。无需设置,只需通过 Burp 代理即可。 - **Broken Crystals** — 覆盖了最广泛的 JWT 漏洞,包括 KID SQL 注入、弱 secret、算法混淆、x5u, x5c, JWK 和 JKU 攻击。使用 docker-compose 在本地运行。 - **WebGoat** — 有一个专门的 JWT 部分,包含 4 个挑战。使用 `docker run -p 8080:8080 webgoat/webgoat` 运行。 - **OWASP Juice Shop** — 使用带有弱 secret 的 JWT,并有多个与 JWT 相关的挑战。 ## 项目结构 ``` jwtlens-burp/ build.gradle Build configuration settings.gradle Project settings src/main/java/com/jwtlens/ JwtLensExtension.java Extension entry point, registers everything JwtLensTab.java Main Burp tab with findings dashboard and config JwtForgeTab.java JWT Forge tab — live editor, signer, PoC exporter SecretExtractor.java Passive secret/key extraction from JS and responses JwksParser.java JWKS JSON parser for real public key extraction JwtToken.java JWT parsing, decoding, encoding, and mutation CryptoUtils.java HMAC, RSA, ECDSA signing and key generation JwtDedup.java Smart deduplication tracker ResponseAnalyzer.java Response comparison for accepted vs rejected WeakSecrets.java Built-in wordlist of 200+ common secrets Findings.java All issue definitions with descriptions PassiveScanCheck.java 23 passive checks ActiveScanCheck.java 33 active checks with proper JWKS-based A07 JwtInsertionPointProvider.java Custom insertion points for JWT tokens JwtContextMenu.java Right-click context menu (request + response aware) ``` ## 许可证 MIT License ## 致谢 由 JWTLens 团队构建。灵感来源于 JWT 安全研究社区和 OWASP Testing Guide。
标签:API 安全, Burp Suite 插件, DevSecOps, JSON Web Token, JS文件枚举, JWKS 解析, JWT 安全测试, KID 注入, Snort++, Talos规则, Web 安全, x5u/x5c 攻击, 上游代理, 主动扫描, 代码生成, 令牌伪造, 后台面板检测, 域名枚举, 密钥提取, 弱密钥爆破, 渗透测试工具, 签名绕过, 算法混淆攻击, 被动扫描