Chương 8: JWT — JSON Web Token
Khái niệm
JWT (JSON Web Token — Token Web dạng JSON) là chuẩn mở (RFC 7519) để truyền thông tin giữa các bên dưới dạng JSON object được ký số. JWT thường dùng thay thế server-side session để authentication stateless.
Mức độ nguy hiểm: Cao — JWT implementation lỗi cho phép hacker giả mạo identity hoặc leo thang đặc quyền.
Cấu trúc JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEzMzcsInJvbGUiOiJ1c2VyIn0.abc123
│──────────────────────────────────────│ │──────────────────────────────────────│ │─────│
Header Payload Signature
Ba phần, ngăn cách bằng dấu chấm, mỗi phần là Base64URL encoded.
Header:
{
"alg": "HS256",
"typ": "JWT"
}
Payload (Claims):
{
"sub": "1337",
"username": "alice",
"role": "user",
"iat": 1609459200,
"exp": 1609462800
}
Signature:
HMACSHA256(
base64url(header) + "." + base64url(payload),
secret_key
)
Quan trọng: JWT được ký số (signed), không phải mã hóa (encrypted). Header và payload có thể đọc được bởi bất kỳ ai có token. Đừng để sensitive data trong payload trừ khi dùng JWE.
Decode JWT
# Decode nhanh bằng base64
echo "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" | base64 -d
# Output: {"alg":"HS256","typ":"JWT"}
# Dùng jwt.io (online) hoặc:
pip install PyJWT
python3 -c "import jwt; print(jwt.decode('TOKEN', options={'verify_signature': False}))"
Các lỗ hổng JWT
1. Algorithm: None Attack
Thuật toán none chỉ định "không cần signature". JWT với alg: none không cần ký, bất kỳ payload nào cũng được accept.
# Tạo JWT với alg: none
header = base64url({"alg": "none", "typ": "JWT"})
payload = base64url({"userId": 1, "role": "admin"})
signature = "" # Không có signature
token = f"{header}.{payload}."
Bypass filter:
Nếu server check "alg" != "none" (case-sensitive):
→ Thử: "None", "NONE", "nOnE", "NoNe"
→ Một số libraries accept các biến thể này
Lab PortSwigger: Dùng Burp JWT Editor extension:
- Intercept request với JWT
- JWT Editor → Edit payload: role=admin
- Attack → None signing algorithm
- Forward request