Привет, покажу одну интересную особенность веб-сайтов, о которой многие слышали, но мало кто реально задумывается, как именно она работает.
Речь пойдет о ситуациях, когда сайт может косвенно выдать, существует аккаунт или нет, даже если снаружи все выглядит защищенным.
Начнем с базы.
Любая авторизация работает примерно так:
- пользователь отправляет данные
- сервер их обрабатывает
- возвращает ответ
Но внутри есть важный момент:
сервер заранее понимает, существует пользователь или нет.
Речь пойдет о ситуациях, когда сайт может косвенно выдать, существует аккаунт или нет, даже если снаружи все выглядит защищенным.
Начнем с базы.
Любая авторизация работает примерно так:
- пользователь отправляет данные
- сервер их обрабатывает
- возвращает ответ
Но внутри есть важный момент:
сервер заранее понимает, существует пользователь или нет.
Теперь к самому интересному - разберем это на простом примере.
Допустим, мы регистрируем новый аккаунт на сайте, чтобы посмотреть, как вообще ведет себя система после авторизации.
Первое, что мы видим, при попытке авторизоваться, reCAPTCHA 3
Убеждаемся в этом, открыв DevTools(F12) -> Network

После авторизации в новом аккаунте можно заметить, что сайт устанавливает нам cookies

На этом этапе видно, что в cookies передаются login и auth (в hex-формате).
Берем эти куки и переходим в нашу IDE посмотреть, как сайт будет реагировать на наши куки с браузера, просто передав их с GET-запросом.
import httpx
cookies = {
'login': 'faslkfaklsfd',
'auth': '2e134b4561c5d2e041845ab57b278ebd'
}
res = httpx.get('https://my.pwclassic.ru/index.php', cookies=cookies)
print(res.headers['Set-Cookie'])
Python

В ответе получаем, что наш login становится deleted, идентично вместе с auth.
Возьмем любой другой login и этот же auth, посмотрим, что из этого выйдет.

Нам выдало ошибку, что параметра Set-Cookie не существует в полученных headers.
В первом случае мы получили:
Set-Cookie: login=deleted;
Set-Cookie: auth=deleted;
Код
То есть сервер явно сбрасывает cookies.
Во втором случае (когда подставили другой login) - в ответе вообще нет Set-Cookie.
Получается интересная картина:
при одних данных сервер сбрасывает cookies
при других - вообще не трогает их
Хотя с точки зрения интерфейса - разницы никакой не видно
Какая в этом логика?
Если упростить, то сервер делает примерно следующее:
if пользователь_существует:
сбросить cookies
else:
ничего не делать
Python
За счет этого можно сделать простой вывод:
если сервер возвращает Set-Cookie: deleted -> одно состояние
если не возвращает -> другое состояние
Сайт сам дает сигнал существует аккаунт или нет
Допустим, мы регистрируем новый аккаунт на сайте, чтобы посмотреть, как вообще ведет себя система после авторизации.
Первое, что мы видим, при попытке авторизоваться, reCAPTCHA 3
Убеждаемся в этом, открыв DevTools(F12) -> Network

После авторизации в новом аккаунте можно заметить, что сайт устанавливает нам cookies

На этом этапе видно, что в cookies передаются login и auth (в hex-формате).
Берем эти куки и переходим в нашу IDE посмотреть, как сайт будет реагировать на наши куки с браузера, просто передав их с GET-запросом.
import httpx
cookies = {
'login': 'faslkfaklsfd',
'auth': '2e134b4561c5d2e041845ab57b278ebd'
}
res = httpx.get('https://my.pwclassic.ru/index.php', cookies=cookies)
print(res.headers['Set-Cookie'])
Python
Код:
import httpx
cookies = {
'login': 'faslkfaklsfd',
'auth': '2e134b4561c5d2e041845ab57b278ebd'
}
res = httpx.get('https://my.pwclassic.ru/index.php', cookies=cookies)
print(res.headers['Set-Cookie'])

В ответе получаем, что наш login становится deleted, идентично вместе с auth.
Возьмем любой другой login и этот же auth, посмотрим, что из этого выйдет.

Нам выдало ошибку, что параметра Set-Cookie не существует в полученных headers.
В первом случае мы получили:
Set-Cookie: login=deleted;
Set-Cookie: auth=deleted;
Код
Код:
Set-Cookie: login=deleted;
Set-Cookie: auth=deleted;
Во втором случае (когда подставили другой login) - в ответе вообще нет Set-Cookie.
Получается интересная картина:
при одних данных сервер сбрасывает cookies
при других - вообще не трогает их
Хотя с точки зрения интерфейса - разницы никакой не видно
Какая в этом логика?
Если упростить, то сервер делает примерно следующее:
if пользователь_существует:
сбросить cookies
else:
ничего не делать
Python
Код:
if пользователь_существует:
сбросить cookies
else:
ничего не делать
если сервер возвращает Set-Cookie: deleted -> одно состояние
если не возвращает -> другое состояние
Сайт сам дает сигнал существует аккаунт или нет
Отдельный момент - reCAPTCHA.
Многие считают, что ее наличие решает проблему, но на практике:
- она проверяет, что запрос отправляет человек
- но не влияет на дальнейшую обработку
Если запрос прошел - вся логика (включая различия) остается как есть.
Многие считают, что ее наличие решает проблему, но на практике:
- она проверяет, что запрос отправляет человек
- но не влияет на дальнейшую обработку
Если запрос прошел - вся логика (включая различия) остается как есть.
Такие различия позволяют:
- определять, существует аккаунт или нет
- собирать списки пользователей
- анализировать поведение системы
И все это происходит без прямого взаимодействия с формой авторизации.
- определять, существует аккаунт или нет
- собирать списки пользователей
- анализировать поведение системы
И все это происходит без прямого взаимодействия с формой авторизации.
Со стороны разработчика решение достаточно простое:
- делать одинаковые ответы в любых случаях
- унифицировать работу с cookies
- не оставлять различий в заголовках
- добавлять rate limit
Главное правило - сервер не должен давать понять, существует аккаунт или нет
- делать одинаковые ответы в любых случаях
- унифицировать работу с cookies
- не оставлять различий в заголовках
- добавлять rate limit
Главное правило - сервер не должен давать понять, существует аккаунт или нет
В итоге получаем довольно типичную ситуацию:
- снаружи есть защита (капча, антибот и т.д.)
- внутри - логика работает по-разному
И именно такие мелкие различия чаще всего и становятся причиной утечек.
- снаружи есть защита (капча, антибот и т.д.)
- внутри - логика работает по-разному
И именно такие мелкие различия чаще всего и становятся причиной утечек.
Комментарии 0