Scan Command
The scan command runs a fast, heuristic assessment of a JWT. It decodes the token, performs common weakness checks, optionally tries weak secrets for HS* tokens, and can print example attack payloads for follow‑up testing.
Basic Usage
jwt-hack scan <TOKEN> [OPTIONS]
What the Scanner Checks
The current scanner performs the following checks:
- Token information
- Displays algorithm and
typfrom the header.
- Displays algorithm and
- Timestamp checks
- Presence of
expand whether it is expired. - Presence of
iatandnbf(no ordering validation betweeniat,nbf,exp).
- Presence of
- “none” algorithm usage
- Flags if the token actually uses the
nonealgorithm.
- Flags if the token actually uses the
- Weak/guessable secret (HS* only)
- For HMAC tokens (HS256/384/512), tries a limited secret list (built‑in or provided wordlist).
- Algorithm confusion indicator
- Flags asymmetric algorithms (RS/ES/PS/EdDSA) as “needs testing” for alg-confusion risks.
- Header misuse indicators
kidpresence (possible SQL/path injection surfaces).jku/x5upresence (possible URL spoofing / remote JWKS risks).
- Attack payload suggestions (optional)
- Prints example payloads for detected issues:
none,alg_confusion,kid_sql.
- Prints example payloads for detected issues:
Notes:
- JWE (5-part) tokens are not supported by
scan. - Compressed JWT payloads (
zip: "DEF") are decoded but not separately highlighted as a finding.
Options
# Skip cracking and payload generation
jwt-hack scan <TOKEN> --skip-crack --skip-payloads
# Provide a wordlist for weak-secret checks (HS* only)
jwt-hack scan <TOKEN> -w /path/to/wordlist.txt
# Limit secret attempts (useful for CI or quick runs)
jwt-hack scan <TOKEN> --max-crack-attempts 100
--skip-crack— Skip dictionary-based weak-secret checks (only affects HS*).--skip-payloads— Skip the payload suggestion/generation section.-w, --wordlist <FILE>— Wordlist for weak-secret detection. If not provided or cannot be opened, a small built‑in list is used.--max-crack-attempts <N>— Limit tested secrets (default: 100).
Tip: Large wordlists can significantly increase scan time. Use --max-crack-attempts to cap work during triage or CI.
Examples
Quick Full Scan
jwt-hack scan eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.PAYLOAD.SIGN
Scan With Wordlist
jwt-hack scan <TOKEN> -w samples/wordlist.txt
Fast Heuristics Only (no cracking, no payloads)
jwt-hack scan <TOKEN> --skip-crack --skip-payloads
CI-Friendly Scan (limit attempts)
jwt-hack scan <TOKEN> -w rockyou.txt --max-crack-attempts 200
Typical Output
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
JWT VULNERABILITY SCANNER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━ Token Information ━━━
Algorithm: HS256
Type: JWT
━━━ Scan Results ━━━
✓ None Algorithm [INFO]
Token does not use 'none' algorithm
✗ Weak Secret [CRITICAL]
Token uses weak/common secret: 'secret'
✓ Algorithm Confusion [INFO]
Token uses symmetric algorithm, not vulnerable to typical alg confusion
✗ Token Expiration [MEDIUM]
Missing 'nbf' (not before) claim; Missing 'iat' (issued at) claim
✗ Missing Claims [LOW]
Missing recommended claims: aud, iss, jti
✓ Kid Header Injection [INFO]
No 'kid' header present
✓ JKU/X5U Header [INFO]
No JKU/X5U headers present
━━━ Summary ━━━
Total Vulnerabilities Found: 3
1 Critical
1 Medium
1 Low
⚠️ Review the vulnerabilities above and consider generating attack payloads.
━━━ Generating Attack Payloads ━━━
... (example payloads for 'none', 'alg_confusion', 'kid_sql')
If the scan finds no significant issues, you’ll see:
✓ No major vulnerabilities detected in this scan.
Behavior Details and Limitations
- HS* only for weak-secret checks
- Secret cracking runs only when the algorithm is HMAC (HS256/384/512). For non‑HS* tokens, this check is skipped as “Not applicable”.
- Algorithm confusion is heuristic
- Asymmetric algorithms are flagged as “needs testing” (High) to prompt follow‑up validation; it is not a confirmed vulnerability by itself.
- JKU/X5U payloads
- The scanner flags the presence of these headers, but the current payload generation prints examples for
none,alg_confusion, andkid_sql. It does not printjku/x5upayload examples in this command’s output.
- The scanner flags the presence of these headers, but the current payload generation prints examples for
Recommended Workflow
- Run a quick scan to triage:
jwt-hack scan <TOKEN> - If a weak secret is suspected (HS*):
jwt-hack crack -w <WORDLIST> <TOKEN> - If payloads are suggested:
jwt-hack payload <TOKEN> --target=all - Verify any hypotheses:
jwt-hack verify <TOKEN> --secret=<KEY or PUBLIC_KEY>
Troubleshooting
- JWE input:
scanexpects a JWT (3 parts). 5‑part JWE tokens are not supported. - If the scan terminates early, ensure the token uses the standard
<header>.<payload>.<signature>format. - For faster results, use
--skip-crackor set--max-crack-attemptsto a small number. - Wordlist path errors: provide an absolute path or a path relative to your project root.
- Usage hint (shown on errors):
e.g jwt-hack scan {JWT_CODE} [--skip-crack] [--skip-payloads] [-w wordlist.txt]
Security Notes
- Only scan tokens you own or have permission to test.
- Treat discovered secrets as sensitive; handle and store them securely.
- Use findings to harden your systems (strong secrets, enforce
exp, avoid risky headers, validate key sources).