
Einfaches Python-Skript zur Überprüfung auf hypothetische JWT-Sicherheitslücke.
Einfaches Python-Skript zur Überprüfung auf eine hypothetische JWT-Schwachstelle.
Angenommen, es gibt eine Anwendung, die JWT-Tokens verwendet, die mit dem HS256-Algorithmus signiert sind. Ein Beispiel-Token sieht wie folgt aus:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.zbgd5BNF1cqQ_prCEqIvBTjSxMS8bDLnJAE_wE-0Cxg
Das obige Token kann zu den folgenden Daten decodiert werden:
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Zur Berechnung der Signatur wird der folgende geheime Schlüssel verwendet:
supersecret
Der folgende Pseudocode wird zur Berechnung der Signatur verwendet:
$alg = "sha256";
$data = "...";
$key = "supersecret";
hmac($alg, $data, $key);
Was passiert jedoch, wenn ein unerwartetes "kid":0-Feld in den Header eingefügt wird?
{
"alg": "HS256",
"typ": "JWT",
"kid": 0
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Das kid-Feld ist eine standardmäßige Möglichkeit, einen Schlüssel auszuwählen. Meine Annahme ist, dass es, wenn das kid-Feld nicht erwartet wird, eine anfällige Implementierung geben könnte, die den String-Wert $key als Array behandelt:
hmac($alg, $data, $key[kid]);
Infolgedessen wird der Wert "s" ($key[0]) als HMAC-Geheimnis verwendet.
Das Skript injector.py nimmt das ursprüngliche JWT-Token, fügt das "kid":0-Feld in den Header ein und generiert Tokens, die mit den Ein-Buchstaben-Geheimnissen signiert sind (ASCII-Codes: 32 - 126 [{space}, !, ", #, ..., x, y, z, {, |, }, ~]):
python3 injector.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.zbgd5BNF1cqQ_prCEqIvBTjSxMS8bDLnJAE_wE-0Cxg
Als Ergebnis werden zwei Dateien erstellt – tokens.txt und tokens_meta.txt. tokens.txt enthält die generierten Tokens und kann als Liste von Payloads für den Burp Intruder verwendet werden. Falls ein Token gültig ist (was bedeutet, dass die Anwendung anfällig ist), kann die Datei tokens_meta.txt verwendet werden, um zu überprüfen, welcher Algorithmus und welcher geheime Schlüssel zur Generierung des jeweiligen Tokens verwendet wurden. Die Datei tokens_meta.txt enthält die folgenden Daten:
token1:algorithmus:geheimnis
...
token{n}:algorithmus:geheimnis
Siehe CHANGELOG