Как узнать, что сайт заблокировал или забанил вас?
Можно отметить следующие признаки обнаружения или противодействия вашей деятельности сайтом, на котором вы собираете данные:
Игнорирование 2FA при восстановлении пароля
Многие сервисы выполняют автоматический вход в аккаунт после завершения процедуры восстановления пароля. Так как доступ к аккаунту предоставляется мгновенно, при входе в аккаунт 2FA может миноваться и полностью игнорироваться.
Impact аналогичного репорта на hackerone, который я прислал недавно:
Если злоумышленник получит доступ к электронной почте жертвы (он может взломать учетную запись с помощью фишинга, brute-force атаки, credentials stuffing и тд), он может обойти 2FA, хотя в этом случае 2FA должен защищать учетную запись. На данный момент для 2FA есть проверка кода Google Authenticator или резервного кода, но не кода из электронного письма, поэтому данный Bypass имеет смысл.
Ограничение скорости потоков с отсутствием блокировки после достижения определенной скорости
Зачастую исследователи безопасности пытаются подобрать код с использованием 5-и или более количества потоков, чтобы быстрее выполнить атаку (в Burp Intruder количество потоков по умолчанию- 5 без задержки). Но иногда система безопасности от перебора или обычный Load Balancer может реагировать только на этот единственный фактор.
Если вы пытаетесь брутфорсить с 5-ю потоками, стоит уменьшить количество до 1-го, а потом до 1-го с задержкой в одну секунду. Ранее мне посчастливилось наблюдать за таким поведением и именно с помощью таких манипуляций произошел успешный подбор кода, что привело к Account Takeover.
Если у 2FA кода нет определенного срока действия, то у нас есть много времени на перебор. Если же срок действия присутствует, то успешность атаки уменьшена, но потенциальная опасность уязвимости все равно присутствует, так как шанс попадания в нужный код все же есть.
. Манипуляция версиями API
Если вы видите в запросе web приложения что-то вроде /v*/, где * — это цифра, то есть вероятность, что можно переключиться на более старую версию API. В старой версии API может быть слабая защита или таковой может вовсе не быть. Это довольно редкое явление и возникает в том случае, если разработчики забыли удалить старую версию API в production/staging среде.
Генерируемый OTP код не изменяется
Это касается не постоянно изменяющихся кодов как в Google Authenticator, а только статичных, которые приходят в SMS, email или личным сообщением в мессенджере.
Суть данного обхода состоит в том, что постоянно или в течении некоторого времени, например, 5 минут, в SMS отправляется один и тот же OTP код, который в течении всего этого времени является валидным. Так же стоить следить за тем, чтобы не произошел silent rate-limit.
Если 2FA крепится к IP-адресу, то можно попытаться его подменить
Чтобы идентифицировать данный метод, войдите в свой аккаунт с помощью функции запоминания 2FA, потом перейдите в другой браузер или incognito режим текущего браузера и попробуйте войти снова. Если 2FA не запрашивается вовсе, значит произошло крепление 2FA к IP-адресу.
Игнорирование 2FA при входе через соцсеть
К аккаунту пользователя можно прикрепить социальную сеть для быстрого входа в аккаунт и одновременно настроить 2FA. При входе в аккаунт через соцсеть, 2FA может игнорироваться. Если email жертвы будет взломан, то можно будет восстановить пароль к аккаунту соцсети (если она позволяет это сделать) и войти на сервис без ввода 2FA.
Impact одного из репортов:
Rate лимит существует, но его можно обойти
Кейсы, которые раньше приходилось встречать:
Сброс rate-limit-a при обновления кода.
В запросе проверки кода, rate-лимит присутствует, но после задействования функционала повторной отправки кода он сбрасывается и позволяет продолжать брутфорс кода.
Примеры репортов:
Обход 2фа с помощью подстановки части запроса из сессии другого аккаунта
Если для верификации кода в запросе отправляется параметр с определенным значением, попробуйте отправить значение с запроса другого аккаунта.
Например, при отправке OTP-кода проверяется ID формы, ID пользователя или cookie, которое связано с отправкой кода. Если применить данные с параметров аккаунта, на котором нужно обойти code-верификацию (Account 1), на сессию совсем другого аккаунта(Account 2), получим код и введем его на втором аккаунте, то сможем обойти защиту на первом аккаунте. После перезагрузки страницы 2FA должна исчезнуть.
Игнорирование 2FA в случае кроссплатформенности
Имплементации 2FA в мобильной или десктопной версии могут отличаться от web версии приложения. 2FA может быть слабее, чем в web версии или вовсе отсутствовать.
7. При отключении 2FA не запрашивается текущий код.
Если при отключении 2FA не запрашивается дополнительное подтверждение, такое как текущий код с google authenticator приложения, код с email/телефона, то в таком случае имеются определенные риски. При чистом запросе существует вероятность CSRF атаки. Если будет найден вектор обхода CSRF защиты (если она есть)
, то 2FA можно будет отключить. Также может использоваться clickjacking уязвимость, — после пары кликов от ничего не подозревающего пользователя 2FA будет отключена. Подтверждение предыдущего кода добавит дополнительную защиту 2FA, учитывая потенциальные CSRF/XSS/Clickjacking атаки, а также CORS misconfigurations.
Обход rate-лимита путем смены IP адреса
Множество блокировок основаны на ограничении приема запросов с IP, который достиг порога определенного количества попыток при выполнении запроса. Если IP-адрес сменить, то есть возможность обойти это ограничение. Для того, чтобы проверить данный способ, просто смените свой IP с помощью Proxy-сервера/VPN и увидите, зависит ли блокировка от IP.
Способы смены IP:
Так как IP rotate тулза отправляет запросы с помощью AWS IP-адресов, все запросы будут блокироваться, если веб приложение находится за CloudFlare фаерволом.
В данном случае нужно дополнительно обнаружить IP оригинального веб сервера или найти способ, не касающийся AWS IP-адресов.
Обход 2FA с помощью «функционала запомининания»
На многих сайтах, поддерживающих 2FA авторизацию, есть функционал «запомнить меня». Он полезен в том случае, когда пользователь не желает вводить 2FA код при последующих входах в аккаунт. Важно идентифицировать способ, с помощью которого 2FA «запоминается». Это может быть cookie, значение в session/local storage или просто крепление 2FA к IP адресу.
На сайте включена поддержка X-Forwarded-For
Встроенный header X-Forwarded-For может использоваться для смены IP. Если в приложение встроена обработка данного хедера, просто отправьте X-Forwarded-For: desired_IP для подмены IP, чтобы обойти ограничение без использования дополнительных прокси. Каждый раз, когда будет отправлен запрос с X-Forwarded-For, веб-сервер будет думать, что наш IP адрес соответствует значению, переданному через хедер.
Материалы на эту тему:
Improper access control баг на странице ввода 2FA
Иногда страница-диалог для ввода 2FA представлена в виде URL с параметрами. Доступ к такой странице с параметрами в URL с cookies, которые не соответствуют тем, которые использовались при генерации страницы или вообще без cookies, — это не безопасно. Но если разработчики решили принять риски, то нужно пройтись по нескольким важным пунктам:
- истекает ли ссылка для ввода 2FA;
- индексируется ли ссылка в поисковиках.
Игнорирование 2FA при определенных обстоятельствах
При выполнении некоторых действий, которые приводят к автоматическому входу в аккаунту, 2FA может не запрашиваться.
Отсутствие Rate-limit-а в личном кабинете
2FA может внедряться в различные функционалы личного кабинета пользователя для большей безопасности. Это может быть изменение email адреса, пароля, подтверждение изменения кода для осуществления финансовых операций, etc. Наличие rate-limit-a в личном кабинете может отличаться от наличия rate-limit-a в 2FA при входе в аккаунт.
Если разработчики изначально добавили защиту против несанкционированного изменения данных, то данную защиту нужно поддерживать и исправлять все возможные bypass-ы. Если bypass найден, то это расценивается как уязвимость обхода «security feature», которая была имплементирована разработчиками.
Где сайты могут обнаружить ботов?
Обнаружение может произойти на стороне клиента, то есть в работающем на вашем компьютере браузере, на стороне сервера, то есть на веб-сервере, или через встроенные технологии защиты от ботов, защищающие трафик сайта путем его перехвата. Также возможно сочетание обоих вариантов.
Веб-серверы либо используют встроенные программные продукты для обнаружения подобного поведения клиентов сайта еще до того, как их запросы дойдут до веб-сервера, либо они используют облачные сервисы, которые действуют до момента получения трафика сайтом или встроены в веб-сервер и опираются на стороннюю обработку трафика, чтобы обнаруживать и блокировать трафик ботов.
Проблема заключается в том, что это обнаружение, как и все остальные средства защиты, характеризуется ложноположительными срабатываниями и приводит к обнаружению и блокировке живых добропорядочных пользователей, ошибочно считая их ботами. Или же оно оказывает непроизводительную нагрузку на сервер, делая сайт медленным и непригодным для использования.
Вот некоторые из мест и ситуаций, при которых парсер может быть обнаружен:
- При считывании цифрового отпечатка на стороне сервера с помощью поведенческого анализа.
- При считывании цифрового отпечатка на стороне клиента или браузера с помощью поведенческого анализа.
- Сочетание этих двух вариантов на многочисленных доменах и в датацентрах.
Замедлите сбор данных, не перегружайте сервер, хорошо «обращайтесь» с сайтами
Боты, предназначенные для парсинга данных, собирают их очень быстро, но сайт легко может обнаружить ваш парсер, так как люди не могут с такой скоростью просматривать веб-страницы. Чем быстрее вы сканируете и собираете данные, тем сильнее всем портите жизнь. Сайт может перестать отвечать на запросы, если получит их больше, чем может обработать.
Сделайте своего «паука» похожим на реального пользователя, имитируя действия человека. Поместите несколько случайных программных периодов бездействия между запросами, добавьте несколько задержек после сбора небольшого количества веб-страниц и выберите как можно меньшее число параллельно отправляемых запросов.
Используйте средства ограничивающего регулирования, которые будут автоматически понижать скорость сбора данных в зависимости от нагрузки как на «паука», так и на сайт, на котором осуществляется сбор данных. Подберите оптимальную скорость «паука» после его нескольких пробных запусков. Периодически повторяйте эту настройку скорости, потому что обстановка со временем действительно меняется.
Используйте сервисы для решения капч
Многие сайты используют меры, направленные против парсинга данных. Если вы собираете большие объемы данных на каком-то сайте, то в конечном итоге вам запретят к ним доступ. Вы начнете видеть веб-страницы с капчей, а не с данными. Существуют веб-сервисы, как например 2Captcha или Anticaptcha, позволяющие обходить эти ограничения.
Если вам необходимо парсить сайты, которые используют капчу, то лучше прибегнуть к помощи подобных сервисов. Услуги ервисов для решения капч относительно дешевы, что будет полезно при масштабном парсинге.
Как сайт может выявить и пресечь парсинг?
Сайты могут использовать различные механизмы, чтобы определить, что пользователь сайта — парсер, или «паук». Некоторые из этих подходов:
- Обнаружение чрезмерного объема трафика или высокой частоты обращения к данным, особенно от одного клиента сайта или IP-адреса за короткий отрезок времени.
- Обнаружение повторяющихся операций, выполняемых на сайте по одной и той же характерной «схеме» просмотра веб-страниц. Этот признак основан на том, что живой пользователь не будет всё время выполнять одни и те же повторяющиеся операции.
- Проверка на то, используете ли вы для отправки запросов к сайту настоящий браузер, будучи реальным пользователем. Простой тест — выполнение JavaScript-кода. Более продвинутые инструменты могут пойти намного дальше и проверять ваши видеокарты и центральные процессоры 😉, чтобы убедиться, что ваши запросы поступают от браузера настоящего пользователя.
- Обнаружение посредством использования приманок, которые обычно представляют собой ссылки, отображаемые только для парсера и скрытые от обычного пользователя. Когда парсер пытается получить доступ к ссылке, срабатывает «сирена».
Как быть с таким методом обнаружения и избежать остановки работы парсера?
Сначала уделите некоторое время исследованию антипарсинговых механизмов, используемых сайтом, а затем соответствующим образом разработайте или откорректируйте парсер. Такой прием в долгосрочной перспективе принесет более качественные результаты и увеличит «срок годности» и надежность вашей работы.
Не используйте одну и ту же схему сбора данных
Как правило, люди не выполняют повторяющиеся задачи, так как просматривают сайт, действуя непредсказуемо. У ботов для сбора данных обычно одна и та же модель поведения при сканировании и сборе данных, потому что они так запрограммированы, если только в них не заложены какие-либо уникальные алгоритмы действий.
Включите в состав операций парсера случайные клики по веб-странице, передвижения курсора и бессистемные действия, которые сделают его похожим на человека.
Обнаружение на стороне клиента (браузера)
Почти все сервисы для обнаружения используют комбинацию инструментов для обнаружения ботов на стороне браузера в сочетании с инструментами их обнаружения на стороне сервера, чтобы более безошибочно препятствовать деятельности ботов.
Первое, что предпринимает сайт в начале процесса обнаружения ботов на стороне клиента, — немедленная блокировка всех парсеров, которые не являются браузерами реальных пользователей.
Для этого ему проще всего проверить, может ли клиент сайта (браузер) выполнить блок кода на языке JavaScript. Если клиент этого сделать не может, средство обнаружения с высокой вероятностью пометит такого клиента в качестве бота. Хотя можно запретить запуск JavaScript-кода в браузере, почти все сайты в Интернете окажутся в таком случае непригодными для использования, а значит в большинстве браузеров эта функция будет включена.
Как только имеет место такая защита от парсинга, чаще всего необходим настоящий браузер, чтобы собирать нужные вам данные. Существуют библиотеки для автоматического управления браузером, как например:
Средства обнаружения ботов на стороне браузера обычно предусматривают формирование цифрового отпечатка путем обращения через браузер к самой разнообразной информации системного уровня. Как правило, такие средства прибегают к использованию отслеживающего JavaScript-файла, который выполняет в браузере обнаруживающий ботов код и отправляет обратно для дальнейшего анализа информацию о браузере и соответствующем компьютере, где этот браузер установлен и функционирует.
Например, объект браузера «navigator» показывает много информации о компьютере, на котором работает браузер. Вот как в раскрытом состоянии выглядит объект «navigator» браузера Safari:
Некоторые из распространенных характерных признаков, используемых для формирования цифрового отпечатка браузера:
Помимо этих технических приемов инструменты обнаружения ботов также ищут любые признаки, которые могут сообщить им о том, что браузер пользователя управляется с помощью библиотеки автоматизации:
- Присутствие признаков, специфических для ботов и демаскирующих их.
- Поддержка нестандартных возможностей браузера.
- Признаки использования популярных инструментов автоматизации, как например Selenium, Puppeteer или Playwright.
- Также учитываются характерные для человека события, как например: произвольные движения мыши, клики, прокрутка веб-страницы, переключения вкладок.
Вся эта информация объединяется, чтобы сформировать уникальный цифровой отпечаток на стороне клиента, который позволяет определить, является ли посетитель сайта ботом или человеком.
Обнаружение на стороне сервера
Это обнаружение ботов начинается на серверном уровне, то есть на веб-сервере сайта или на устройствах облачных сервисов, которые находятся «перед» сайтом на пути следования запросов к нему, отслеживают трафик, а также выявляют и блокируют ботов. Методы считывания цифровых отпечатков, подразделяемые на несколько типов, обычно используются в сочетании и преследуют цель обнаружения ботов на стороне сервера.
Считывание цифрового отпечатка в целом пагубно влияет на конфиденциальность данных посетителей сайта, позволяя без проблем отслеживать активность отдельных пользователей по всему Интернету, но это уже отдельная тема.
Обойти аутентификацию или авторизацию
Многие веб-серверы имеют встроенные возможности разграничения доступа. Простейший пример — это ограничить доступ админке (к директории admin). А при обращении к ней требовать от пользователя аутентифицироваться, используя Basic-аутентификацию. Большой плюс в том, что разграничение доступа реализуется только за счет возможностей веб-сервера. И не надо париться со скриптами, писать код какой-то…
Кроме этого, опять-таки большинство браузеров позволяют еще внедрять контроль HTTP-методов (они же verb). То есть можно ограничить доступ к какому-то объекту только по методу GET, а POST — разрешить, например, смотреть фильмы онлайн бесплатно. Это добавляет еще больше возможностей с точки зрения конфигурации. Но, как это часто и бывает, порождает целую прослойку конфигурационных уязвимостей. Что интересно, проблемы с настройкой несколько варьируются в зависимости от веб-сервера, и потому несколько классических примеров.
Есть сервер приложений J2EE, а в нем — web.xml со следующим содержанием:
< security — constraint>
< web — resource — collection>
< url — pattern>/admin/< /url — pattern>
< http — method>GET< /http — method>
< http — method>POST< /http — method> < /web — resource — collection>
< auth — constraint>
< role — name>admin< /role — name> < /auth — constraint> < /security — constraint>
Здесь все просто. Мы указываем, что доступ к директории admin разрешен только админам (о чем нам и сообщает указанная роль).
Проблема, я думаю, ясна. Здесь также перечислены методы, которые запрещены (то есть используются blacklist-правила). Заметно, что методов «не хватает». Как минимум, админчик позабыл метод HEAD. Это метод, по сути, эквивалент GET’a. С той лишь разницей, что сервер отвечает на него по-другому. Обрабатывает, но в ответ не посылает тело, только заголовок.
Таким образом, мы имеем возможность обойти проверку веб-сервера и обращаться к сервлетам, используя метод HEAD. Конечно, нам еще требуется, чтобы в этой директории мы могли сделать что-то «страшное», используя только HEAD, но это уже совсем зависит от конкретного приложения. К тому же на нашей стороне еще и тот факт, что в яве ОЧЕНЬ часто сервлеты не различают GET и POST.
Пример номер два. Apeche РНР. В нем валяется файл .htaccess с вроде бы нормальным ограничением на доступ только с определенного IP (предположим, что это админский IP). Остальные доступ получить не могут (см. пункт deny from all).
< Limit GET POST>
order deny,allow
deny from all
allow from 192.168.0.1
Конечно, ты можешь тут сразу отметить, что отсутствует метод HEAD. Но нет, это здесь не сработает, так как Apache по умолчанию блокирует HEAD, если GET запрещен.
Зато другие особенности нам помогут. Во-первых, Apache, когда в конфигурационных файлах используется директива Limit, обрабатывает только известные ему методы запросов (GET, HEAD, POST, TRACE, PUT и так далее, полный список смотри здесь :..- Iy/150z22). Неизвестные методы он переправляет на уровень выше — приложению, обрабатывающему запрашиваемый файл (например, РНР).
Таким образом, ограничения не действуют на эти кастомные методы. Но еще интересней второе. По умолчанию РНР, когда видит неизвестный ему метод, воспринимает и обрабатывает его как GET.
Обобщая сказанное, мы видим, что Apache и РНР создают смесь, которая дает нам простую возможность обойти ограничения эпача. Все, что требуется, так это обращаться напрямую к PHP-скриптам, используя нестандартный HTTP-метод. Webscarab или Burp отлично подойдут для автоматической подмены метода.
Логичный DOS
Маленькая задачка про атаку «из дедушкиного сундука». Она сверхпроста, но прикольна в своей идее — для обучения правильному ходу мышления. Название атаки — Land.
Суть ее в том, чтобы указать один и тот же адрес и порт (IP нашей жертвы) в пакете. Таким образом, когда данный пакет попадет к жертве, она на него ответит, но при этом ответит сама себе. Итог — пакеты, которые так и не могут обработаться сетевым стеком, приводят к DoS’y всего хоста.
Некогда эта проблема была во многих ОС и девайсах, включая Windows ХР и продукты Cisco. Хотя и сейчас, я думаю, можно найти такие косяки в каких-нибудь embedded — устройствах или промышленных контроллерах…
Опасайтесь приманок (traps)
Приманки, или ловушки в виде приманок, — это системы, созданные для привлечения злоумышленников и обнаружения любых их попыток получения несанкционированного доступа к информации. Обычно приманка — это приложение, имитирующее поведение реальной системы.
При переходе по ссылкам всегда убеждайтесь в том, что у ссылки задана подходящая видимость и нет тега nofollow. У некоторых ссылок-приманок, предназначенных для обнаружения парсеров, будет задан CSS-стиль display: none, или они будут спрятаны благодаря использованию цвета, который сливается с цветом фона веб-страницы.
Такой способ обнаружения парсеров, очевидно, непрост и требует значительного объема работы, связанной с программированием, чтобы успешно его реализовать. Как следствие, этот прием не используется широко как на стороне сервера, так и на стороне бота или парсера.
Отправляйте запросы через прокси-серверы и при необходимости выполняйте их ротацию
При парсинге ваш IP-адрес может быть виден. Сайт будет знать о ваших действиях и о том, занимаетесь ли вы сбором данных. Сайты могут считывать такие данные, как закономерности в поведении пользователей или пользовательский опыт, если они зашли на сайт впервые.
Многочисленные запросы, исходящие из одного и того же IP-адреса, приведут к тому, что вы окажетесь без доступа к данным, поэтому нужно использовать более одного IP-адреса. При отправке запросов через прокси-сервер целевой сайт не будет знать, из какого IP-адреса были отправлены исходные запросы, что усложняет обнаружение парсера.
Создайте пул доступных для использования IP-адресов и используйте для каждого запроса случайный IP-адрес из этого пула. При этом нужно распределить несколько запросов по множеству IP-адресов.
Поведенческий анализ и обнаружение шаблонных действий
Как только уникальный цифровой отпечаток будет сформирован из всех перечисленных выше элементов, инструменты обнаружения ботов смогут отслеживать поведение посетителя на сайте или на множестве сайтов, если они пользуются услугами по обнаружению ботов от того же поставщика таких услуг. Эти инструменты проводят поведенческий анализ того, как пользователи просматривают сайт. Обычно этот анализ учитывает:
Эти признаки позволяют программным продуктам, предназначенным для борьбы с ботами, определять, является ли посетитель сайта ботом или человеком, основываясь на данных, которые они прочитали ранее. Также в некоторых случаях подобные инструменты отправляют пользователю задачу, которую он должен решить, например капчу.
Если посетитель решит капчу, то система может принять его за настоящего пользователя, а если решение капчи завершится провалом, что типично для большинства ботов, которые не ожидают появления капчи, то такого «посетителя» система пометит как бота и запретит ему доступ к сайту.
Проверяйте, меняет ли сайт разметку
Некоторые сайты отправляют немного разные варианты HTML-разметки, чтобы усложнить парсерам задачу сбора данных.
Например, на сайте 1–20 веб-страниц будут отображать одну разметку, а остальные страницы могут отображать другую. Чтобы справиться с этой проблемой, убедитесь в том, что парсинг данных выполняется с использованием XPath’ов или селекторов CSS. Если это не так, проверьте, как именно отличается разметка, и добавьте в свой программный код условие, согласно которому сбор данных на таких веб-страницах осуществляется по-другому.
Считывание цифрового отпечатка данных, связанных со стеком tcp/ip
Данные, которые посетитель отправляет на серверы, приходит на них в качестве пакетов по протоколам TCP/IP. Цифровой отпечаток данных, связанных с TCP, включает в себя следующие подробные данные:
- Исходный размер пакета (16 битов).
- Исходный TTL (8 битов).
- Размер окна (16 битов).
- Максимальный размер сегмента (16 битов).
- Величина масштабирования окна (8 битов).
- Флаг «don’t fragment», то есть «не разбивать на фрагменты» (1 бит).
- Флаг «sackOK» (1 бит).
- Флаг «nop» (1 бит).
Вход в личный кабинет