Согласно спецификации
JWS, обязательным является только параметр alg. Однако на практике заголовки JWT часто содержат несколько других параметров. Следующие из них представляют особый интерес для нас.jwk (JSON Web Key) - Предоставляет встроенный объект JSON, представляющий ключ.jku (JSON Web Key Set URL) - Предоставляет URL, по которому серверы могут получить набор ключей, содержащих правильный ключ.kid (Key ID) - предоставляет идентификатор, который серверы могут использовать для определения правильного ключа в случаях, когда есть несколько ключей на выбор. В зависимости от формата ключа, он может иметь соответствующий параметр kid.Как вы видите, эти контролируемые пользователем параметры указывают серверу-получателю, какой ключ использовать при проверке подписи.
Спецификация
JSON Web Signature (JWS) описывает дополнительный параметр заголовка jwk, который серверы могут использовать для встраивания своего открытого ключа непосредственно в сам токен в формате JWK.{
{
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"typ": "JWT",
"alg": "RS256",
"jwk": {
"kty": "RSA",
"e": "AQAB",
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"n": "yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9m"
}
}
В идеале серверы должны использовать только ограниченный белый список открытых ключей для проверки подписей JWT. Однако неправильно настроенные серверы иногда используют любой ключ, встроенный в параметр jwk.Вы можете использовать это поведение, подписав модифицированный
JWT с помощью собственного закрытого ключа RSA, а затем вставив соответствующий открытый ключ в заголовок jwk.Хотя вы можете вручную добавить или изменить параметр
jwk в Burp, расширение JWT Editor предоставляет полезную функцию, которая поможет вам проверить эту уязвимость:Сгенерируйте новый ключ RSA.
Отправьте запрос, содержащий
JWT, в Burp Repeater.Измените пэйлоад токена по своему усмотрению.
Выберите
Embedded JWK. Когда появится запрос, выберите только что сгенерированный RSA-ключ.Отправьте запрос, чтобы проверить, как ответит сервер.
Вы также можете выполнить эту атаку вручную, добавив заголовок
jwk самостоятельно. Однако вам также может понадобиться обновить параметр kid заголовка JWT, чтобы он соответствовал kid встроенного ключа. Встроенная атака расширения сделает этот шаг за вас.