Karim-Deghidy/JWT-Security-Lab
GitHub: Karim-Deghidy/JWT-Security-Lab
这是一个JWT安全漏洞的交互式学习实验室,用于解决JWT实现中的常见安全缺陷。
Stars: 0 | Forks: 0
# jwt安全实验室
## 概述
JSON Web Tokens 支撑着绝大多数现代 REST API 和单页应用的身份验证。在渗透测试和漏洞赏金计划中,JWT 处理过程中的细微实现缺陷是反复出现的问题——通常会导致身份验证被完全绕过,并引发横向或纵向权限提升。
本实验室重现了一个存在漏洞的真实 Flask API 及一个经过加固的参考实现。每个漏洞类别都被隔离,可利用所附脚本进行攻击,并配有文档完善的、生产级别的缓解措施。
## 漏洞覆盖范围
| ID | 类别 | 严重性 | OWASP 映射 | 影响 |
|----|-------|----------|---------------|--------|
| VULN-01 | 算法混淆 (RS256 → HS256) | 🔴 严重 | API2:2023 身份验证失效 | 使用服务器公钥伪造可信令牌 |
| VULN-02 | None 算法绕过 | 🔴 严重 | API2:2023 身份验证失效 | 无需密钥材料即可消除签名验证 |
| VULN-03 | 弱 HMAC 密钥 / 离线暴力破解 | 🔴 严重 | API2:2023 身份验证失效 | 离线恢复签名密钥;铸造任意令牌 |
## 架构
```
jwt-security-lab/
├── app.py # Vulnerable target server → :5000
├── secure_app.py # Hardened reference server → :5001
├── requirements.txt
├── attacks/
│ ├── none_bypass.py # VULN-02 — None algorithm exploit
│ ├── brute_force.py # VULN-03 — Offline HMAC brute-force
│ └── alg_confusion.py # VULN-01 — RS256→HS256 key confusion
└── templates/
└── index.html # Interactive browser-based UI
```
易受攻击服务器和加固服务器暴露相同的端点接口 (`/login`, `/dashboard`, `/admin`),以便在每个权限边界直接比较行为。
## 设置
```
git clone https://github.com/KarimDeghidy/jwt-security-lab.git
cd jwt-security-lab
pip install -r requirements.txt
```
## 运行实验室
### 1 — 启动易受攻击的目标
```
python app.py
# 正在监听 http://127.0.0.1:5000
```
### 2 — 打开浏览器界面
导航到 `http://127.0.0.1:5000`
使用 `karim / password1` (用户) 或 `admin / adminpass` (管理员) 登录,然后使用攻击面板交互式地触发每个漏洞利用。
### 3 — 运行漏洞利用脚本
在 `app.py` 运行时,打开第二个终端。
## 漏洞利用演练
### VULN-02 — None 算法绕过
```
python attacks/none_bypass.py
```
**可观察输出:** 使用未签名的伪造令牌,从 `/admin` 获取 HTTP 200 响应。
### VULN-03 — 弱密钥离线暴力破解
```
python attacks/brute_force.py
```
**机制:** HS256 是对称方案;相同的密钥用于签名和验证令牌。被拦截的令牌可以遭受离线字典攻击,无需与服务器交互——通过重新计算 HMAC 并与令牌的签名段进行比较来测试每个候选密钥。一旦恢复,该密钥即授予完全的签名权限:可以断言任何用户、任何角色、任何过期时间。
**可观察输出:** 毫秒级内恢复密钥 `secret123`;伪造的 `role=admin` 令牌被 `/admin` 接受。
### VULN-01 — 算法混淆 (RS256 → HS256)
```
python attacks/alg_confusion.py
```
**机制:** 基于 RSA 的 JWT 方案使用非对称密钥——私钥签名,公钥验证。一个易受攻击的解码器如果信任令牌头中的 `alg` 字段,则可能被操纵切换到对称 (HS256) 验证。由于公钥是公开可用的,攻击者可以使用它作为 HMAC 密钥来签名伪造的令牌。该易受攻击的解码器——现在以 HS256 模式运行——将根据相同的公钥字节验证签名并接受该令牌。
此脚本完全独立,无需运行服务器;它在内部模拟易受攻击的解码器以演示接受条件。
**可观察输出:** 伪造的 `role=admin` 令牌被易受攻击的解码器接受;相同的令牌被加固的解码器拒绝。
## 缓解措施 (加固服务器)
运行参考实现进行比较:
```
python secure_app.py
# 正在监听 http://127.0.0.1:5001
```
| 漏洞 | 根本原因 | 应用的修复 |
|---------------|-----------|-------------|
| VULN-01 — 算法混淆 | `alg` 来源于令牌头 | 服务器端算法白名单: `algorithms=["HS256"]` |
| VULN-02 — None 绕过 | 未排除 `alg=none` | 白名单从结构上消除了 `none`——无需显式检查 |
| VULN-03 — 弱密钥 | 可通过字典猜测的 HMAC 密钥 | `secrets.token_hex(32)` — 256 位 CSPRNG 输出,永不硬编码 |
`secure_app.py` 中应用的额外加固:
- 强制执行必需声明 (`exp`, `iat`)
- 捕获并记录 `InvalidAlgorithmError` 以进行异常检测
- 密钥在运行时获取——不提交到源代码控制
## 学习目标
- 理解 JOSE 头部处理以及算法选择如何成为攻击面
- 重建并针对实时目标执行每个漏洞利用变体
- 侧对侧阅读并推理易受攻击与加固的解码器实现
- 将发现映射到 OWASP API 安全 Top 10 和相关 CWE
- 使用加固的参考服务器应用并验证每个缓解措施
## 技术栈
`Python 3.10+` · `Flask` · `PyJWT` · `cryptography` · `flask-cors` · `requests`
## 免责声明
本项目专为**授权的安全研究和教育目的**构建。
请仅针对您拥有或获得明确书面测试许可的系统执行这些漏洞利用。
作者对滥用行为不承担任何责任。
## 作者
**Karim Deghidy** — 网络安全工程师
Web 渗透测试员 (WPT) — HTB Academy · CCNA — DEPI
[LinkedIn](https://www.linkedin.com/in/karim-deghidy-b80b21252) · [Hack The Box](https://app.hackthebox.com)
标签:API安全, Flask框架, HMAC安全, JSON输出, JWT安全, REST API, Web安全, 后端开发, 安全实验室, 安全教育, 安全测试, 攻击性安全, 攻击脚本, 漏洞重现, 算法混淆, 蓝队分析, 认证绕过, 身份验证漏洞, 逆向工具