Authentication & Session - Hunter Knowledge Base
SkillFiles & storageKnowledge base for finding authentication and session-management failures - weak login, broken JWT/session handling, password/reset flaws, MFA bypass, credential storage issues. Use when hunting authentication (not authorization - see sh-kb-access-control). CWE-287/384/613/620/640, OWASP A07:2021-Identification and Authentication Failures.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Authentication & Session - Hunter Knowledge Base skill
What this skill tells your AI
The instructions your AI receives, as published by dmdhrumilmistry/security-harness in skills/sh-kb-auth/SKILL.md and read by ahel’s review.
Failures in proving who the user is (vs access-control, which is what they may do). Covers login,
sessions, tokens, password handling, and account recovery.
What to hunt
- JWT flaws:
alg:noneaccepted; algorithm confusion (RS256 verified with the public key as an HMAC secret); signature not verified (decodewithout verify); secret hardcoded/weak (offline-brute-forceable); noexpcheck; trusting unverified claims for authz. Header-parameter injection:kidused to look up the verification key via a path (traversal to a predictable low-entropy file, e.g./dev/null-> empty-string HMAC key) or a DB query (SQLi);jwkheader lets the server verify against an attacker-embedded public key (attacker signs with the matching private key);jku/x5uheader points to an attacker-hosted key set/certificate with no host allowlist. - Session management: session id not rotated after login (fixation, CWE-384); no server-side
invalidation on logout; predictable/low-entropy tokens; missing
HttpOnly/Secure/SameSite; overly long/absent expiry (CWE-613); session token in URL. - Password handling: plaintext or fast-hash storage (
md5/sha1/unsalted) instead of bcrypt/scrypt/ argon2 (CWE-256/916); no rate limiting / lockout (credential stuffing, CWE-307); timing-unsafe comparison of secrets (==on tokens); lockout counter keyed by source IP instead of the account (trivially bypassed with distributed attempts) or a lockout with no path to self-recovery (usable as a DoS against a victim). - Account recovery: guessable/predictable reset tokens, reset token that doesn't expire or isn't single-use, host-header poisoning in reset links, user enumeration via differing responses (CWE-640).
- MFA: verification step skippable, OTP not rate-limited/reusable, backup-code weaknesses.
- Broken "remember me" / trust tokens; OAuth
statemissing (CSRF on login); redirect_uri not validated.
Sinks / patterns (grep targets)
jwt.decode(/verify(, algorithms=, verify=False, verify_signature, md5(/sha1( near "password",
== comparing tokens/HMACs (vs hmac.compare_digest/crypto.timingSafeEqual), session[, set_cookie,
SECRET_KEY, random/Math.random for tokens, password_reset, otp, login, authenticate, JWT header
parsing that reads kid/jwk/jku/x5u before signature verification.
Detection recipe
- Find the login, logout, session-issue, password-store, and reset flows from
codebase-map.json. - For JWT: check the verify call actually verifies signature +
exp+ expectedalg, and the secret's source. - For sessions: is the id regenerated on privilege change/login? cookie flags set? entropy adequate?
- For passwords: which hash + salt? is comparison constant-time? is there lockout/rate limiting?
- For reset: token entropy, expiry, single-use, and whether the reset link host comes from a request header.
Payloads / PoC
- JWT none: set header
{"alg":"none"}, drop signature, changesub/role. Confusion: sign with RS256 public key as HMAC secret. Expired token still accepted -> noexpcheck. - JWT header injection:
kid->../../../../dev/null(then sign with empty-string HMAC key) or a SQLi string ifkidfeeds a key-lookup query;jwk-> attacker's own public key embedded in the header, token signed with the matching private key;jku/x5u-> attacker-controlled URL serving a malicious key set/certificate. - Fixation: set a session id pre-login, authenticate, check it's unchanged.
- Reset poisoning:
POST /forgotwithHost: attacker.com-> link points to attacker. - Enumeration: compare responses/timing for known vs unknown usernames.
False-positive filters
- Vetted library with defaults (Django auth, Devise, Spring Security, NextAuth, Passport) used correctly.
- JWT verified with the right algorithm+secret and
exp/nbfenforced; secret from env/secret manager. kidresolves only against a fixed in-memory/config map of known key ids (no path/DB use);jwkheader ignored in favor of a pinned server-side key;jku/x5urestricted to a strict host allowlist.- Passwords via bcrypt/argon2/scrypt with per-user salt; constant-time compares for secrets.
- Session id from a CSPRNG; cookie flags set; rotation on login present in middleware.
- Lockout counter keyed by account (not just source IP) with a bounded exponential delay, and a working self-recovery path so lockout can't be used to lock out a victim.
CWE / OWASP / severity
CWE-287/384/613/620/640/307/916. OWASP A07:2021. Auth bypass / token forgery -> critical; weak hashing or missing lockout -> high; missing cookie flags / enumeration -> medium.
Chaining hints
Weak session/JWT + xss or open-redirect/Referer leak -> token theft -> takeover; user enumeration +
no lockout -> credential stuffing; reset-token flaw -> account takeover; access-control IDOR that leaks
tokens feeds this. Auth bypass unlocks every authenticated finding.
Mitigation
Use a maintained auth framework; verify JWT signature+alg+exp (never none); pin/allowlist the verification
key rather than trusting kid/jwk/jku/x5u from the token itself; store passwords with argon2/bcrypt+salt;
constant-time secret comparison; rotate session id on login and invalidate on logout; set
HttpOnly/Secure/SameSite; CSPRNG single-use expiring reset tokens; rate-limit + lockout keyed by
account with exponential backoff and a DoS-safe recovery path; enforce MFA.
Signals
- GitHub stars
- 26
- Forks
- 9
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
sh-kb-auth- Source
- github.com/dmdhrumilmistry/security-harness