Наверное, у каждого есть друзья, участвующие в каких-либо конкурсах (либо же у них есть дети, которые участвуют во всевозможных мероприятиях). И вот в один прекрасный момент они обращаются к тебе с просьбой «накрутить» счетчик. Не будем разбираться хорошо это или нет с моральной точки зрения (с одной стороны – плохо, с другой стороны – это же друзья), а разберемся, как это сделать и как защититься от накруток.
Относительно честный способ (особенно, если у тебя много друзей в социальных сетях) – разослать всем сообщение (например, путем создания записи на своей страничке в социальной сети) с просьбой проголосовать и ссылкой на страничку голосования. Можно сделать рассылку по «электронке», Viber, отправить в свой телеграмм-канал и т.д. Способ может принести свои результаты и при этом тебе ничего не придется делать. Например, у одного моего знакомого более 9000 контактов в скайпе. Если хотя бы 10% проголосуют, это будет 900 голосов, причем абсолютно «легальных» – действительно, зашел человек и проголосовал.
Защиты от этого способа нет, поскольку, по сути, все абсолютно нормально. Голосует то человек добровольно и его никто не принуждает. Ведь просьбу можно поддержать, но можно и проигнорировать.
Второй способ – использование сервисов накрутки. Недостаток этого способа – придется платить за каждый голос. Конечно, все зависит от призового фонда – если игра стоит свеч, почему бы нет? Конкретный сервис накрутки рекомендовать не буду, чтобы не делать никому рекламу.
Как защититься – зависит от того, какую тактику будет использовать сервис накрутки. Как правило, используется или накрутка с помощью анонимайзеров или же специалисты сервиса ищут уязвимости в голосовалке. Администратору голосовалки можно посоветовать проанализовать логи сервера на предмет подозрительной активности – один или несколько участников стали быстро набирать голоса. Не только посредством бэканда голосовалки можно посмотреть, кто голосовал, но и посредством логов средства – нужно отфильтровать лог доступа (как правило, он называется access.log) по названию сценария, зачисляющего голоса. Например, если сценарий называется poll.php и ему передается два параметра – id (номер голосования) и pid (номер участника), то команда будет выглядеть так:
cat access.log | grep poll.php?id=1&pid=1703
Все зависит от реализации самого сценария опроса. Если он принимает данные методом GET, тогда этот способ поможет выяснить, с каких IP происходило голосование за конкретного кандидата и как часто оно происходило.
Если же обращение к сценарию проходит посредством POST, нужно научить его логировать POST-запросы. В этом тебе поможет libapache2-modsecurity, дополнительную инфу найдешь в Интернете.
Способ номер 3 подразумевает накрутку с помощью анонимайзеров, прокси, Tor и других средств для смены IP. Обо всем этом еще поговорим. О защите тоже не забудем.
Как ты уже догадался, мы подробно остановимся на двух последних способах. Ведь недостаток первого способа – не факт, что кто-то проголосует, то есть гарантированного количества голосов получить нельзя. Недостаток второго способа – нужно платить реальные деньги, с которыми всегда жалко расставаться.
А вот два последних способа позволяют накрутить счетчик и получить результат в любом случае, да еще и бесплатно. Админам не нужно расстраиваться: лекарство есть.
Анонимайзер – это сайт, позволяющий зайти на сайт под другим IP-адресом. Все достаточно просто: ты заходишь на сайт анонимайзера, вводишь адрес странички голосования, переходишь на нее (она считает тебя уже новым пользователем, так как IP-адрес сменен) и голосуешь. Далее нужно сменить анонимайзер или выбрать другой сервер в списке, если сайт анонимайзера позволяет это сделать.
Найти анонимайзер очень просто – по запросу «anonymizer free» в Google. Неплохие ресурсы:
Все они позволяют выбрать различные серверы, поэтому с помощью одного сайта ты сможешь добавить несколько голосов.
Если анонимайзер позволяет установить параметры соединения, обязательно сними галку с Remove Scripts – скрипты (вроде JavaScript) часто используются голосовалками и удалив их, опросник работать не будет.
Не включай Remove Scripts
Это простейший способ накрутить голосование и довольно удобный. Недостаток в том, что анонимайзеров не так уж и много.
Здесь принцип такой же, как и у анонимайзера: меняешь IP, заходишь на сайт голосовалки и голосуешь. Вот только использовать его менее удобно. Первым делом нужно получить список анонимных прокси. Вот ресурсы, где регулярно публикуют такие списки:
Конечно, это не единственные списки прокси, но в Сети ты без проблем найдешь еще с десяток списков. Первый список наиболее удобен, поскольку позволяет отфильтровать список по типу прокси (нам нужен HTTP или HTTPS в зависимости от адреса сайта-голосовалки), стране, номерам портов, анонимности и т.д.
Список анонимных прокси
Как показывает практика, на колонку Speed можно не обращать внимания – это скорость доступа этого сервиса к прокси. У тебя она может быть другая, например, отлично работать прокси со скоростью 5100ms и не открываться прокси со скоростью 100ms.
Далее алгоритм следующий:
Заходишь на сайт и голосуешь. Если страничка загружается медленно или вообще не загружается, пробуй следующий адрес в списке. Желательно голосовать в режиме приватного окна (инкогнито в Chrome), чтобы «голосовалка» не оставляла Cookies.
Берешь следующий адрес в списке и goto п. 1.
Все предельно просто. Если такой способ кажется тебе слишком сложным, можешь использовать расширения для браузера, позволяющие сменить IP-адрес – вроде FireX Proxy.
Расширение FireX Proxy для Firefox
Не забывай регулярно обновлять список прокси. «Обработал» первые две страницы списка – обновляй, появятся новые прокси, возможно, с лучшими параметрами.
Недостатки:
Помню, как-то «накручивал» голосовалку на сайте, где можно было голосовать раз в 24 часа. Соответственно, сегодня я узурпировал какой-то IP-адрес, завтра – кто-то другой. Довольно неблагодарное занятие, узурпирующее много времени. Поскольку человек – создание ленивое и умное, то нужно искать альтернативные решения.
Способ прост как мир. Некоторые голосовалки позволяют выбрать страну, с которой можно голосовать, также можно установить, можно ли повторно голосовать с одного и того же IP. В некоторых случаях разрешается голосовать с одного и того же IP через определенное время.
Значит так: устанавливаем, что можно голосовать только с России (ты же не думаешь, что за мисс первого курса твоего универа будут голосовать из Кении, Бангладеша и Зимбабве?) и только с одного IP. Конечно, в России тоже есть анонимные прокси, но их гораздо меньше, чем во всем мире. Да и возможность проголосовать с одного IP только один раз, позволит зачислить небольшое количество голосов, которое никак не повлияет на результат.
Если беспокоишься и за это небольшое количество, тогда делаем так:
Сложнее, если сценарий не поддерживает ограничение по стране. Тогда нужно реализовать такую проверку собственными силами. Организовать проверку страны, города, региона по IP-адресу можно с помощью всевозможных сервисов.
Вот как можно получить город с помощью geoplugin.net:
function get_geo_city($ip) {
А вот уже готовая функция для получения региона:
С помощь SxGeo организовать проверку можно так:
Преимущество первого способа (geoplugin) – не нужно периодически обновлять базу IP-адресов. Но и есть недостаток – название городов возвращает на английском. Если для внутреннего использования, то неплохой вариант. Если же нужно организовать вывод названия города кириллицей, тогда – второй вариант. Недостаток – нужно периодически обновлять базу адресов.
Теперь включаем логику. Если у нас голосование местного масштаба (вроде мисс Краснодар), то можно смело ограничить голосование Краснодарским краем – это вполне логично и ты отсеешь большую часть всевозможных прокси.
Последний способ самый сложный и заключается он в выявлении всевозможных «дыр» в системе голосования. Недостаток – голосовалка может не иметь слабых мест (если ее правильно спроектировали), следовательно, у тебя ничего не получится.
В данной статье будет описан эксперимент, рецепт которого был найден на просторах Сети. Цель эксперимента – выявление «дыр» в расширении SexyPolling для Joomla! (https://extensions.joomla.org/extension/sexy-polling/). Само по себе расширение довольно дырявое и подвержено SQL Injection, мы не рекомендуем его к использованию. Но в ходе проведения эксперимента были выявлены дополнительные «дыры», никак не связанные с SQL Injection.
Первым делом смотрим, как организована кнопка «Голосовать». В случае с SexyPolling это было так:
Смотрим код страницы. По понятным причинам «все лишнее» закрыто.
Как видишь, классической формы нет, обработкой нажатия кнопки занимается JavaScript-сценарий. Судя по всему, он и передает твой голос на сервер. Смотрим в <head> сценарии (хотя сценарии могут быть определены и в конце страницы). Ищем сценарий, содержащий в названии polling, poll, voting и т.д.
Определяем сценарий голосовалки
По названию этого файла можно понять, с чем имеешь дело. Определив сценарий голосовалки, можно нагуглить инфу о его уязвимостях.
Смотрим код сценария, чтобы понять, как он устроен. Видим, что обработка IP-адресов (попытка узнать регион и т.д.) осуществляется на стороне клиента, то есть в JavaScript:
Далее стало понятно, какому сценарию передается выбранный пользователем вариант ответа, а также параметры, которые ему передаются:
Далее можно попробовать передать ему эти параметры вручную. Нужно вычислить было только два значения – это ID голосования (параметр polling_id) и номер ответа. Это можно сделать путем просмотра кода страницы. Вот ID голосования:
Вычисляем ID голосования
Теперь находим ID ответа. Вкладка Elements в инструментах разработчика Chrome нам поможет.
Вычисляем ID ответа
Самый простой способ передачи POST-запроса (а судя по JavaScript-коду отправляется именно POST-запрос) – обычная HTML-форма. Подойдет вот такая формочка:
Передаются ID голосования, номер ответа и параметр sexypolling.
Открываем HTML-файл в браузере (желательно через Tor, чтобы не светить свой IP) и нажимаем кнопочку Submit. Далее смотрим на счетчик – о чудо – он увеличился! Да, если бы расширение было бы написано правильно и перед увеличением счетчика проверяло бы IP-адрес, то ничего бы не вышло. А оно было организовано иначе – сначала JS проверяет IP и отображает красивый счетчик времени до следующей попытки, если человек уже голосовал с этого IP, или же «дергает» сценарий vote.php, который просто увеличивает счетчик нужного кандидата. И ему все равно, сколько вы отправили запросов – хоть 100, хоть 10000 с одного IP.
Форма в браузере
Нажимать кнопочку – это тоже работа, поэтому можно автоматизировать сей процесс:
Это простейший PHP-сценарий, отправляющий POST-запрос сценарию vote.php. Думаю, сценарий понятен без каких-либо комментариев. Если у тебя есть вопросы, обратись к документации по PHP.
Далее нужно обеспечить автоматический запуск этого сценарий. Если ты счастливый пользователь VDS от Xelent или же у тебя на домашнем компе установлена Linux, самым правильным способом будет добавить вызов PHP-сценария (у меня он называется test.php) в расписание cron:
crontab -e
Расписание cron
В данном примере сценарий запускается каждые 5 минут. То есть каждые 5 минут твой кандидат получит голос. При желании можно запускать этот сценарий каждую минуту или вообще организовать цикл и добавить любое количество голосов сразу. Здесь уже как захочешь.
Если же у тебя есть обычный хостинг, можешь «залить» PHP-сценарий накрутки на хостинг, установить в браузер расширение перезагрузки страницы (вроде Page Reload) и настроить его на перезагрузку страницы со сценарием каждые несколько минут. Для сокрытия своего IP можно использовать Tor Browser.
Есть три рекомендации:
Вместо die() можешь организовать редирект на страничку, на которой можешь изложить все, что ты думаешь по поводу накрутки:
if (get_geo_city($ip)!=="Moscow") header('Location: nakrutka.html');
Чтим уголовный кодекс
Цель эксперимента – показать, как легко можно произвести накрутку счетчика голосования при условии наличия уязвимостей в системе голосований, и описать способы защиты от противоправных действий. Ни одна реальная система не пострадала и весь процесс производился в лабораторных условиях – на локальных машинах.
Желающим проверить данный эксперимент в реальных условиях, нужно ознакомиться со статьей 274 УК РФ.