Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен

Просматривая веб-сайт, я заметил 2 вещи при попытке удалить токен:

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #1

предполагая, что я нажму на кнопку Удалить этот токен (на рисунке выше)
будет отправлен post-запрос /api/tokens/delete/302 или /api/tokens/delete/some_number, и я вижу в burp, что в заголовке файла cookie csrftoken = vhHMjvtks3jwGkHikbY48d5gQR76yvPA , и я вижу в отправленных параметрах, что csrfmiddlewaretoken= 8b9QkWMZgnqohp9R77Tu4m46PQW0YZRwtiGsth59ygzKNzGZh8Ho2pZcvxTWmkwW 8b9qkwmzgnqohp9r77tu4m46pqw0yzrwtigsth59ygzknzgzh
что я заметил, так это то, что изменение значения 'csrfmiddlewaretoken' на значение csrftoken по-прежнему заставит запрос работать..
т.е. установка csrfmiddlewaretoken = vhHMjvtks3jwGkHikbY48d5gQR76yvPA по-прежнему позволит выполнить запрос

это и есть настоящий запрос

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #2

это измененный запрос, который работает!

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #3

измененный запрос успешно удалил токен api

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #4

я заметил, что csrftoken, отправляемый в запросах, не является уникальным для идентификатора сеанса или зарегистрированного пользователя, то есть, если я вошел в систему как пользователь 1 и у меня есть csrftoken=x, я могу войти в систему как пользователь 2 и отправить запрос с csrftoken=x и csrfmiddlewaretoken=x, и это сработает!
например, у одного из пользователей, которых я зарегистрировал, токен csrf был csrftoken= c7wq7XJaQq71Eump3tVwNJpOSHLbiqSC
допустим, я хочу снова удалить токен
, это исходный запрос, который я получаю как пользователь2

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #5

я меняю токен csrf и csrfmiddlewaretoken на токен csrf, который я получил при входе в систему как пользователь1
, т.е. я использую токен csrf другого пользователя

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #6

и, как вы можете видеть, этот запрос работает просто отлично и удалил токен api

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #7

что это значит?

1.это означает, что csrfmiddlewaretoken на самом деле не добавляет еще один уровень защиты, я могу легко изменить его с помощью токена csrf, хранящегося в файле cookie, и он все равно будет работать

2. при наличии действительного csrftoken от любого пользователя (например, csrftoken=c7wq7XJaQq71Eump3tVwNJpOSHLbiqSC), можно создать запрос csrf, который отправляет запрос POST /api/tokens/delete/index (где индекс может быть перечислен) с этим действительным csrftoken, отправляемым как значение csrfmiddlewaretoken, и с
X-CSRF-токен также устанавливается в качестве действительного токена csrf, и это будет работать, и мы сможем управлять удалением токенов пользовательского api с помощью эксплойта csrf (например, нажав на веб-сайт, который отправляет такой запрос).

я также вижу, что при отправке запроса параметров в /api/tokens/delete
заголовками разрешения контроля доступа являются заголовки разрешения контроля доступа: accept, authorization, content-type, user-agent, csrf token, x-requested-with
access-control-allow-methods: DELETE, GET, OPTIONS, PATCH, POST, PUT
access-control-allow-origin: *

Баг Баунти - Репорт в компанию Mozilla. CSRFToken не уникален для сеанса или конкретного пользователя, и CSRFMiddlewaretoken может быть изменен, image #8

Шаги для воспроизведения:
1. войдите в систему как любой пользователь (user1), извлеките токен csrf из файла cookie и сохраните его где-нибудь
1.1.попробуйте удалить существующий токен api (если у вас его нет, создайте его), перехватите запрос и измените csrfmiddlewaretoken на токен csrf, который вы взяли из файла cookie, вы должны увидеть, что запрос по-прежнему будет работать.

2. теперь выйдите из системы от имени пользователя 1 и войдите в систему как пользователь 2

3. попробуйте удалить существующий токен api (если у вас его нет, создайте его), перехватите запрос и измените csrfmiddlewaretoken и csrftoken на первый токен csrf, который вы получили при входе в систему user1, вы увидите, что запрос сработает и пройдет.
Impact
Резюме:

Эксплойт CSRF

1.это означает, что csrfmiddlewaretoken на самом деле не добавляет еще один уровень защиты, я могу легко изменить его с помощью токена csrf, хранящегося в файле cookie, и он все равно будет работать

2. при наличии действительного csrftoken от любого пользователя (например, csrftoken=c7wq7XJaQq71Eump3tVwNJpOSHLbiqSC), можно создать запрос csrf, который отправляет запрос POST /api/tokens/delete/index (где индекс может быть перечислен) с этим действительным csrftoken, отправляемым как значение csrfmiddlewaretoken, и с
X-CSRF-токен также устанавливается в качестве действительного токена csrf, и это будет работать, и мы сможем управлять удалением пользовательских токенов api

37 views·4 shares