На странице
Брутфорс stay-logged-in cookie
Лаборатория
Brute-forcing a stay-logged-in cookie · Practitioner
Решение
Дано
This lab allows users to stay logged in even after they close their browser session. The cookie used to provide this functionality is vulnerable to brute-forcing.
To solve the lab, brute-force Carlos's cookie to gain access to his My account page.
Your credentials: wiener:peter
Victim's username: carlos
Candidate passwords
Анализ задания
На сайте есть механизм «stay logged», кука которого уязвима к брутфорсу. У нас есть аккаунт на сайте, поэтому изучим, как работает механизм, и осуществим брутфорс-атаку для пользователя carlos.
Разведка
Заходим на сайт, есть форма входа. Логин и пароль, есть чекбокс «Stay logged in», ставим его. Логинимся, POST-запрос на вход:
Set-Cookie: stay-logged-in=d2llbmVyOjUxZGMzMGRkYzQ3M2Q0M2E2MDExZTllYmJhNmNhNzcw; Expires=Wed, 01 Jan 3000 01:00:00 UTC
Set-Cookie: session=XaXGwGwLG5aeRpAyJZfClJJuAMavi7ll; Secure; HttpOnly; SameSite=None
Мы видим, что кука stay-logged-in хранится бесконечно долго. А ещё она никак не защищена от доступа из JS. Если выделить значение куки, Inspector по умолчанию показывает декодированную строку в Base64, она выглядит как wiener:51dc30ddc473d43a6011e9ebba6ca770.
Очевидно, что первое — это имя пользователя, а вот второе напоминает хэш пароля. Вопрос только от чего, от пароля или что-то ещё. Можем для начала попробовать просто посчитать MD5 от пароля wiener — peter.
В терминале echo -n 'peter' | md5sum:
51dc30ddc473d43a6011e9ebba6ca770
Совпадает! То есть мы можем построить брутфорс-атаку по словарю. Мы можем кидать запросы на GET /my-account?id=carlos, предварительно сконструировав stay-logged-in куку.
Сперва посмотрим, как ведёт себя этот роут, если мы удалим куку session и оставим только stay-logged-in. Вернулось 200, и установилась кука session.
Ок, а теперь без кук совсем — в этом случае возвращает 302 и редиректит на логин. Закидываем запрос в Intruder, удаляем session куку, ставим переменную в значение куки. Какого вида будет значение?
- Берём MD5 от пароля-кандидата — нам дали 100 штук.
- Формируем строку
carlos:MD5_password. - Кодируем полученную строку в Base64.
Напишем bash-скрипт для генерации списка нагрузок:
while read -r pass; do
hash=$(echo -n "$pass" | md5sum | awk '{print $1}')
echo -n "carlos:$hash" | base64
done < passwords.txt > payloads.txt
В passwords.txt закидываем пароли-кандидаты от PortSwigger.
Закидываем нагрузки в Intruder. 200 код пришёл для нагрузки:
Cookie: stay-logged-in=Y2FybG9zOjIxYjcyYzBiN2FkYzVjN2I0YTUwZmZjYjkwZDkyZGQ2
Лаба решена!
Ещё в этой категории
Внедрение произвольного объекта в PHP (PortSwigger Lab)
Восстановление утёкшего исходного кода и внедрение сериализованного объекта CustomTemplate, чей __destruct удаляет произвольный файл.
Эксплуатация небезопасной десериализации через функции приложения (PortSwigger Lab)
Подмена поля `avatar_link` в объекте сессии для удаления произвольного файла через функцию удаления аккаунта.
Изменение типов сериализованных данных (PortSwigger Lab)
Эксплуатируем нестрогое сравнение PHP, меняя тип `access_token` на целое `0` и обходя аутентификацию.