Ein praktischer JWT-Pentest-Workflow
Eine erprobte Abfolge zum Testen von JWT-Implementierungen: Sammlung, Decoding, Claims, Schlüssel, Replay und Reporting.
Ein guter JWT-Pentest ist keine Trickkiste, die zufällig auf ein Token abgefeuert wird. Er ist ein Workflow. Du sammelst Tokens aus echten Flows, klassifizierst Issuer und Audiences, verstehst, wo Verifikation passiert, und testest dann konkrete Fehlermodi mit Belegen. Ziel ist nicht zu beweisen, dass JWTs gruselig sind. Ziel ist zu zeigen, wo diese Implementierung dem Falschen vertraut.
Sammlung und Inventar
Erfasse Tokens aus Login, Refresh, Passwort-Reset, Invite-Links, mobilen APIs, Websocket-Upgrades und Hintergrundrequests. Lege sie mit Issuer, Audience, Algorithmus, kid, Lebensdauer, Scopes und Akzeptanzstellen in einer Tabelle ab. Kopiere keine rohen Produktionstokens in gemeinsame Notizen. Speichere redigierte Header und Payloads und halte Secrets im Test-Vault.
Dekodiere vor dem Angriff. Viele Findings stehen in sichtbaren Claims: lange Lebensdauer, fehlendes aud, breite Scopes, Tenant-Kennungen, Email-Verified-Flags oder Debug-Felder, die den Issuer nicht verlassen sollten. Vergleiche Tokens von zwei Benutzern und zwei Tenants. Unterschiede zeigen das Autorisierungsmodell oft schneller als Quellcode.
Signatur- und Schlüsseltests
Teste Algorithmus-Pinning, alg: none, HS256-gegen-RS256-Confusion, unbekanntes kid, doppeltes kid und JWKS-Cache-Verhalten. Ändere pro Test nur eine Variable. Halte exp, iss und aud gültig, außer du testest sie explizit. Wenn jedes manipulierte Token dieselbe frühe Ablehnung bekommt, ist das ein guter Beleg. Wenn Endpunkte unterschiedlich fehlschlagen, kartiere diese Trennung.
Claim-Missbrauch und Autorisierung
Ändere sub, tenant_id, org_id, role, scope und Feature-Flags. Prüfe objektbezogenen Zugriff zwischen Tenants mit einem gültigen Low-Privilege-Token. Bei GraphQL testest du Resolver-Autorisierung, nicht nur den HTTP-Endpunkt. Bei Datei-Downloads prüfst du Erstellung der signierten URL und tatsächlichen Abruf getrennt. Viele Systeme autorisieren eine Seite und vergessen die andere.
Replay und Lebenszyklus
Prüfe, ob Logout serverseitig etwas widerruft. Verwende alte Refresh Tokens nach Rotation erneut. Teste abgelaufene Tokens knapp innerhalb und außerhalb des Clock-Skew-Fensters. Probiere Tokens nach Passwortwechsel, MFA-Reset, Rollenentzug und Benutzerdeaktivierung. Lebenszyklus-Bugs sind oft ausnutzbarer als exotische Kryptofehler, weil sie echten Angreifer-Timelines entsprechen.
Gutes Reporting
Ein starkes Reporting enthält die exakt geänderte Token-Eigenschaft, den Endpunkt, erwartetes Ergebnis, tatsächliches Ergebnis und Impact. Vermeide Token-Dumps. Gib sichere Reproduktionsschritte mit redigierten Payloads und Timestamps. Remediation ist meist konkret: RS256 für Issuer X pinnen, unbekanntes kid ohne unbegrenzten Fetch ablehnen, Tenant-Ownership auf Route Y erneut prüfen.