NullAILab/nullai-token-playground
GitHub: NullAILab/nullai-token-playground
一个交互式 JWT 安全演练平台,从零用纯标准库实现五种经典 JWT 攻击并提供安全参考实现与静态分析器,帮助安全从业者深入理解 Token 安全的攻防对抗。
Stars: 0 | Forks: 0
# Token 滥用演练场




JSON Web Token 无处不在——但其灵活性也带来了广泛的攻击面。`alg:none` 绕过、弱 HMAC 密钥、接受未签名 token 以及算法混淆(RS256→HS256)的滥用,都已出现在实际生产的 CVE 中。这是一个交互式实验室,仅使用纯标准库(无 JWT 库)从零实现了五种经典的 JWT 攻击,同时提供了安全的参考实现、静态分析器和深色主题的 Web UI——让你可以并排对比攻击与正确的防御方式。
## 功能
- **五个攻击实验室** — 每个都演示了独立的 JWT 漏洞类别
- `alg:none` 绕过 — 漏洞库接受未签名 token
- 弱密钥签名 — 使用字典离线破解 HS256 token
- 声明篡改 — 替换 payload,保留原始(已失效)签名
- 密钥破解 — 字典攻击恢复 HMAC 密钥
- 算法混淆 — 使用公钥作为密钥将 RS256 token 重新签名为 HS256
- **安全参考** — 正确的 `create_token` / `verify_token`,包含 expiry、issuer 和 audience 验证
- **静态分析器** — 标记 `alg:none`、缺少 `exp`、生命周期过长、权限声明、key ID 提示
- **FastAPI REST API** — 每个实验室和工具均作为 JSON endpoint 暴露
- **深色主题 Web UI** — 彩色编码的 JWT 部分 (header.payload.signature),每个发现都有严重程度徽章
- **纯标准库加密** — 零外部 JWT 库;所有签名均通过 `hmac`、`hashlib`、`base64`、`json` 完成
- **41 项测试** — 涵盖 utils、forge、secure、analyzer 以及所有 API endpoint 的单元测试
## 技术栈
| 组件 | 技术 |
|-----------|------------|
| 语言 | Python 3.10+ |
| Web 框架 | FastAPI 0.110+ |
| 加密 | `hmac`, `hashlib`, `base64` (仅标准库) |
| 模板 | Jinja2 |
| 测试 | `pytest` + `httpx` (TestClient) |
## 项目结构
```
26-token-abuse-playground/
├── src/
│ ├── jwt/
│ │ ├── utils.py # b64url helpers, assemble/split, HMAC sign/verify
│ │ ├── forge.py # Five JWT attack implementations
│ │ ├── secure.py # Correct create_token / verify_token / decode_unverified
│ │ └── analyzer.py # Static analysis — findings with severity codes
│ ├── api/
│ │ └── routes.py # FastAPI router — all lab, secure, and utility endpoints
│ ├── templates/
│ │ └── index.html # Dark-themed single-page UI
│ └── app.py # FastAPI application factory
├── tests/
│ └── test_playground.py # 41 unit and integration tests
├── examples/
│ └── demo_tokens.py # CLI demo — generates and analyzes example tokens
└── requirements.txt
```
## 快速开始
```
git clone https://github.com/NullAILab/nullai-token-playground.git
cd nullai-token-playground
pip install -r requirements.txt
# 运行测试
cd src && python -m pytest ../tests/ -v
# 启动服务器
cd src && python app.py
# 打开 http://localhost:8000
```
## 攻击实验室
### 1 — alg:none (`POST /api/lab/none-alg`)
JWT 规范最初允许将 `"none"` 作为有效算法,这意味着不需要签名。
许多较老的库在不检查的情况下接受此值——任何声明都可以被伪造:
```
forge_none_alg({"sub": "user", "role": "admin"}, alg_value="none")
# → eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJ1c2VyIiwicm9sZSI6ImFkbWluIn0.
```
尝试大小写变体:`None`、`NONE`、`nOnE`——不同的解析器接受不同的大小写。
### 2 — 弱密钥 (`POST /api/lab/weak-secret`)
HS256/512 的安全性完全取决于密钥的熵。拥有捕获 token 的攻击者,
可以在没有速率限制或锁定的情况下运行离线字典攻击:
```
forge_weak_secret(payload, "secret") # valid HS256 token
crack_secret(token, wordlist) # recovers "secret" instantly
```
### 3 — 声明篡改 (`POST /api/lab/tamper`)
用攻击者控制的声明替换 payload,同时保留原始的(现已失效的)
签名。跳过验证的库会毫无异议地接受伪造的 token:
```
forged = tamper_claims(original_token, {"role": "admin", "sub": "attacker"})
```
### 4 — 密钥破解 (`POST /api/lab/crack`)
纯 Python 字典攻击——对于短密钥不需要 GPU:
```
crack_secret(token, ["secret", "password", "123456", "admin"])
# 返回匹配的 secret 字符串,或 None
```
### 5 — 算法混淆 (`POST /api/lab/confusion`)
使用服务器的 PEM 公钥作为 HMAC 密钥,将 RS256 token 重新签名为 HS256。
存在漏洞的库将使用其自己的公钥验证 HMAC 并接受伪造的 token:
```
forged = algorithm_confusion(rs256_token, public_key_pem)
```
## 安全参考
```
from jwt.secure import create_token, verify_token, JWTError
# 创建正确签名的 token
token = create_token(
{"sub": "user1"},
secret,
alg="HS512",
expires_in=3600,
issuer="https://example.com",
)
# 验证 — 在任何失败时引发 JWTError
try:
payload = verify_token(token, secret, expected_issuer="https://example.com")
except JWTError as e:
print(f"Rejected: {e}")
```
`verify_token` 会拒绝:`alg:none`、非 HMAC 算法、错误的密钥、过期的 token、issuer/audience 不匹配。
## 静态分析器
```
from jwt.analyzer import analyze
result = analyze(token)
for f in result.findings:
print(f"[{f.severity}] {f.code}: {f.description}")
# [CRITICAL] ALG_NONE: Token 使用 alg='none' — 无签名,极易伪造
# [HIGH] MISSING_EXP: Token 无过期时间(缺少 exp claim)— 永久有效
# [HIGH] PRIVILEGE_CLAIM: 'role'='admin' — 确保这是有意的
```
## API 参考
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| POST | `/api/lab/none-alg` | 伪造 alg:none token |
| POST | `/api/lab/weak-secret` | 使用弱密钥签名 + 验证可破解性 |
| POST | `/api/lab/tamper` | 替换 payload,保留失效签名 |
| POST | `/api/lab/crack` | 对 token 进行字典攻击 |
| POST | `/api/lab/confusion` | RS256→HS256 算法混淆 |
| POST | `/api/secure/create` | 创建正确签名的 token |
| POST | `/api/secure/verify` | 带有完整验证的校验 |
| POST | `/api/analyze` | 静态分析(无需密钥) |
| POST | `/api/decode` | 不进行验证解码 |
## 运行测试
```
cd src && python -m pytest ../tests/ -v
# 41 通过,用时 0.77s
```
所有测试均使用 FastAPI 的 `TestClient`,无需服务器进程。
## 负责任的使用
本工具仅用于在**受控环境中**理解漏洞——包括你自己的基础设施、授权的渗透测试或安全教育。请勿将这些技术应用于你不拥有或没有明确书面授权测试的系统。
## 许可证
MIT 许可证 + 负责任的使用指南。完整条款请参见[许可证](LICENSE)。
标签:alg:none, AV绕过, CISA项目, FastAPI, HMAC, HS256, JSON Web Token, JWT, Python, REST API, RS256, Web安全, 令牌伪造, 加密算法, 安全实验, 安全编码, 安全规则引擎, 安全靶场, 弱密钥, 无后门, 漏洞复现, 漏洞攻防, 算法混淆, 算法绕过, 网络安全, 网络测绘, 蓝队分析, 身份验证绕过, 运行时操纵, 逆向工具, 错误基检测, 隐私保护, 静态代码分析, 黑客防御