Найти в Дзене
B0rn2beR00T

Решение PortSwigger (JWT authentication bypass via unverified signature)

Приветствую! JWT часто встречается в веб-ресурсах и знать возможные проблемы, возникающие при неверной конфигурации защиты токена следует знать каждому уважающему себя пентестеру. Это точно увеличит ваши шансы на пробив защиты ресурса. JWT — это цифровой пропуск, который пользователь получает после входа в систему. Этот пропуск содержит информацию о пользователе (например, его ID) и подписан сервером, чтобы нельзя было его подделать. Клиент (браузер или мобильное приложение) прикрепляет этот токен к каждому запросу, и сервер, проверив подпись, узнаёт, кто перед ним. JWT состоит из трёх частей, разделённых точками: xxxxx.yyyyy.zzzzz JWT позволяет безопасно подтвердить, что пользователь — это действительно он. Сервер может проверять подпись токена и доверять содержащейся в нём информации без необходимости хранить сессии. Разберём простой кейс с JWT-токеном. Для начала авторизируемся под кредами wiener:peter, которые нам выдали в условии таска. В истории запросов можем увидеть url /my-a

Приветствую!

JWT часто встречается в веб-ресурсах и знать возможные проблемы, возникающие при неверной конфигурации защиты токена следует знать каждому уважающему себя пентестеру. Это точно увеличит ваши шансы на пробив защиты ресурса.

JWT — это цифровой пропуск, который пользователь получает после входа в систему. Этот пропуск содержит информацию о пользователе (например, его ID) и подписан сервером, чтобы нельзя было его подделать. Клиент (браузер или мобильное приложение) прикрепляет этот токен к каждому запросу, и сервер, проверив подпись, узнаёт, кто перед ним.

JWT состоит из трёх частей, разделённых точками: xxxxx.yyyyy.zzzzz

  • Header (заголовок) — содержит тип токена и алгоритм подписи (например, HS256).
  • Payload (полезная нагрузка) — включает данные (claims), например:
    - ID пользователя
    - email
    - срок действия токена
    - роли
  • Signature (подпись) — создаётся на основе первых двух частей и секретного ключа. Нужна для защиты от подделки.

JWT позволяет безопасно подтвердить, что пользователь — это действительно он. Сервер может проверять подпись токена и доверять содержащейся в нём информации без необходимости хранить сессии.

Разберём простой кейс с JWT-токеном.

Для начала авторизируемся под кредами wiener:peter, которые нам выдали в условии таска.

-2

В истории запросов можем увидеть url /my-account?id=wiener, где судя по всему происходит проверка под каким пользователем будет совершён вход.

-3

При детальном просмотре запроса видим в заголовке Cookie JWT-токен.

-4

При двойном клике по токену видим его составляющие. Нам необходима часть токена payload, чтобы поменять необходимый параметр пользователя:

-5

Burp Suit имеет возможность декодировать токен, чтобы видеть параметры полезной нагрузки. Меняем значение sub на administrator и применяем изменение (Apply changes).

-6

Делаем запрос к панели администратора /admin (необходимо по условию задачи) с изменённым JWT-токеном.

-7

В ответе сервера будет следующий href с запросом на удаление пользователя carlos, что нам и нужно по условию.

<a href="/admin/delete?username=carlos">

Удаляем пользователя carlos:

-8

Мы удалили carlos и тем самым выполнили условие задачи. Победа!

-9

Выводы

Это самый простой кейс с JWT-токеном. Т.к. он не требует секретного ключа подписи, мы можем изменить полезную нагрузку и изменить необходимые параметры, что позволит подделать токен и авторизоваться как иной пользователь или под другими правами. Что и было наглядно показано в данной задаче.

Всех благ!