Накрутка результатов голосований. Показываем как защититься

17 Января 2019

Наверное, у каждого есть друзья, участвующие в каких-либо конкурсах (либо же у них есть дети, которые участвуют во всевозможных мероприятиях). И вот в один прекрасный момент они обращаются к тебе с просьбой «накрутить» счетчик. Не будем разбираться хорошо это или нет с моральной точки зрения (с одной стороны – плохо, с другой стороны – это же друзья), а разберемся, как это сделать и как защититься от накруток. 

intro.jpg

Выбираем оптимальный способ

Способ 1. Друзья друзей

Относительно честный способ (особенно, если у тебя много друзей в социальных сетях) – разослать всем сообщение (например, путем создания записи на своей страничке в социальной сети) с просьбой проголосовать и ссылкой на страничку голосования. Можно сделать рассылку по «электронке», Viber, отправить в свой телеграмм-канал и т.д. Способ может принести свои результаты и при этом тебе ничего не придется делать. Например, у одного моего знакомого более 9000 контактов в скайпе. Если хотя бы 10% проголосуют, это будет 900 голосов, причем абсолютно «легальных» – действительно, зашел человек и проголосовал.

Защиты от этого способа нет, поскольку, по сути, все абсолютно нормально. Голосует то человек добровольно и его никто не принуждает. Ведь просьбу можно поддержать, но можно и проигнорировать.

Способ 2. Сервисы накрутки

Второй способ – использование сервисов накрутки. Недостаток этого способа – придется платить за каждый голос. Конечно, все зависит от призового фонда – если игра стоит свеч, почему бы нет? Конкретный сервис накрутки рекомендовать не буду, чтобы не делать никому рекламу.

Как защититься – зависит от того, какую тактику будет использовать сервис накрутки. Как правило, используется или накрутка с помощью анонимайзеров или же специалисты сервиса ищут уязвимости в голосовалке. Администратору голосовалки можно посоветовать проанализовать логи сервера на предмет подозрительной активности – один или несколько участников стали быстро набирать голоса. Не только посредством бэканда голосовалки можно посмотреть, кто голосовал, но и посредством логов средства – нужно отфильтровать лог доступа (как правило, он называется access.log) по названию сценария, зачисляющего голоса. Например, если сценарий называется poll.php и ему передается два параметра – id (номер голосования) и pid (номер участника), то команда будет выглядеть так:

cat access.log | grep poll.php?id=1&pid=1703

Все зависит от реализации самого сценария опроса. Если он принимает данные методом GET, тогда этот способ поможет выяснить, с каких IP происходило голосование за конкретного кандидата и как часто оно происходило.

Если же обращение к сценарию проходит посредством POST, нужно научить его логировать POST-запросы. В этом тебе поможет libapache2-modsecurity, дополнительную инфу найдешь в Интернете.

Способ 3. Накрутка с помощью анонимайзеров

Способ номер 3 подразумевает накрутку с помощью анонимайзеров, прокси, Tor и других средств для смены IP. Обо всем этом еще поговорим. О защите тоже не забудем.

Способ 4. Взлом сценария для голосования

Как ты уже догадался, мы подробно остановимся на двух последних способах. Ведь недостаток первого способа – не факт, что кто-то проголосует, то есть гарантированного количества голосов получить нельзя. Недостаток второго способа – нужно платить реальные деньги, с которыми всегда жалко расставаться.

А вот два последних способа позволяют накрутить счетчик и получить результат в любом случае, да еще и бесплатно. Админам не нужно расстраиваться: лекарство есть.

Накрутка с помощью анонимайзеров 

Анонимайзер – это сайт, позволяющий зайти на сайт под другим IP-адресом. Все достаточно просто: ты заходишь на сайт анонимайзера, вводишь адрес странички голосования, переходишь на нее (она считает тебя уже новым пользователем, так как IP-адрес сменен) и голосуешь. Далее нужно сменить анонимайзер или выбрать другой сервер в списке, если сайт анонимайзера позволяет это сделать.

Найти анонимайзер очень просто – по запросу «anonymizer free» в Google. Неплохие ресурсы:

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

Если анонимайзер позволяет установить параметры соединения, обязательно сними галку с Remove Scripts – скрипты (вроде JavaScript) часто используются голосовалками и удалив их, опросник работать не будет.

1.png

Не включай Remove Scripts

Это простейший способ накрутить голосование и довольно удобный. Недостаток в том, что анонимайзеров не так уж и много.

Анонимные прокси

Здесь принцип такой же, как и у анонимайзера: меняешь IP, заходишь на сайт голосовалки и голосуешь. Вот только использовать его менее удобно. Первым делом нужно получить список анонимных прокси. Вот ресурсы, где регулярно публикуют такие списки:

Конечно, это не единственные списки прокси, но в Сети ты без проблем найдешь еще с десяток списков. Первый список наиболее удобен, поскольку позволяет отфильтровать список по типу прокси (нам нужен HTTP или HTTPS в зависимости от адреса сайта-голосовалки), стране, номерам портов, анонимности и т.д.

2.png

Список анонимных прокси

Как показывает практика, на колонку Speed можно не обращать внимания – это скорость доступа этого сервиса к прокси. У тебя она может быть другая, например, отлично работать прокси со скоростью 5100ms и не открываться прокси со скоростью 100ms.

Далее алгоритм следующий:

  1. Открываешь браузер и вводишь параметры прокси (надеюсь, ты сможешь это сделать без подробной инструкции)
    3.png

    Установка параметров прокси в Firefox
  2.  Заходишь на сайт и голосуешь. Если страничка загружается медленно или вообще не загружается, пробуй следующий адрес в списке. Желательно голосовать в режиме приватного окна (инкогнито в Chrome), чтобы «голосовалка» не оставляла Cookies.

  3. Берешь следующий адрес в списке и goto п. 1.

Все предельно просто. Если такой способ кажется тебе слишком сложным, можешь использовать расширения для браузера, позволяющие сменить IP-адрес – вроде FireX Proxy.

4.png

Расширение FireX Proxy для Firefox

Не забывай регулярно обновлять список прокси. «Обработал» первые две страницы списка – обновляй, появятся новые прокси, возможно, с лучшими параметрами.

Недостатки:

  • Если кто-то такой же умный, как и ты, то нужно действовать быстро. Скорее всего, списки прокси окажутся и у конкурентов и IP-адреса будут заняты.
  • Недостаток расширений вроде FireX Proxy – ограниченный набор прокси. На сайтах, публикующих списки, выбор будет побогаче.

Помню, как-то «накручивал» голосовалку на сайте, где можно было голосовать раз в 24 часа. Соответственно, сегодня я узурпировал какой-то IP-адрес, завтра – кто-то другой. Довольно неблагодарное занятие, узурпирующее много времени. Поскольку человек – создание ленивое и умное, то нужно искать альтернативные решения.

Если облака для вас
не просто теория
Широкий спектр услуг
по выделенным северам
и мультиклауд-решениям
Конфигурация VPS и бесплатный тест уже через 2 минуты
Организация вашей IT-инфраструктуры на основе мультиклауд-решения

Защищаемся от анонимайзеров 

Способ прост как мир. Некоторые голосовалки позволяют выбрать страну, с которой можно голосовать, также можно установить, можно ли повторно голосовать с одного и того же IP. В некоторых случаях разрешается голосовать с одного и того же IP через определенное время.

Значит так: устанавливаем, что можно голосовать только с России (ты же не думаешь, что за мисс первого курса твоего универа будут голосовать из Кении, Бангладеша и Зимбабве?) и только с одного IP. Конечно, в России тоже есть анонимные прокси, но их гораздо меньше, чем во всем мире. Да и возможность проголосовать с одного IP только один раз, позволит зачислить небольшое количество голосов, которое никак не повлияет на результат.

Если беспокоишься и за это небольшое количество, тогда делаем так:

  1. Ограничиваешь возможность голосования только с России
  2. Ищешь в Инете постоянно обновляющиеся списки прокси, выбираешь только российские адреса (как правило, указывается страна прокси) и добавляешь их в .htaccess в конструкции deny from)
  3. Повторяешь пункт 2 каждый день – вдруг появится новый адрес. Голосование не длится вечно, как правило, есть определенные сроки голосования. Рано или поздно у тебя соберется хороший список российских прокси, который будет нужно будет обновлять, скажем, раз в месяц.

Сложнее, если сценарий не поддерживает ограничение по стране. Тогда нужно реализовать такую проверку собственными силами. Организовать проверку страны, города, региона по IP-адресу можно с помощью всевозможных сервисов.

Вот как можно получить город с помощью geoplugin.net:

function get_geo_city($ip) {
$ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip));
  if($ip_data && $ip_data->geoplugin_city != null)
{
    $result = $ip_data->geoplugin_city;
}
  return $result;
}

А вот уже готовая функция для получения региона:

function get_geo_region($ip) {
$ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip));
if($ip_data && $ip_data->geoplugin_region != null)
{
    $result = $ip_data->geoplugin_regionName;
}
return $result;
}

С помощь SxGeo организовать проверку можно так:

// Подключаем SxGeo.php класс
include("SxGeo.php");
// Создаем объект
$SxGeo = new SxGeo('SxGeoCity.dat');
  $ip = $_SERVER['REMOTE_ADDR'];
  var_export($SxGeo->getCityFull($ip)); // Вся информация о городе
var_export($SxGeo->get($ip));         // Краткая информация о городе или код страны (если используется база SxGeo Country)

Преимущество первого способа (geoplugin) – не нужно периодически обновлять базу IP-адресов. Но и есть недостаток – название городов возвращает на английском. Если для внутреннего использования, то неплохой вариант. Если же нужно организовать вывод названия города кириллицей, тогда – второй вариант. Недостаток – нужно периодически обновлять базу адресов.

Теперь включаем логику. Если у нас голосование местного масштаба (вроде мисс Краснодар), то можно смело ограничить голосование Краснодарским краем – это вполне логично и ты отсеешь большую часть всевозможных прокси.

Способ 4: ломаем голосовалку

Последний способ самый сложный и заключается он в выявлении всевозможных «дыр» в системе голосования. Недостаток – голосовалка может не иметь слабых мест (если ее правильно спроектировали), следовательно, у тебя ничего не получится.

В данной статье будет описан эксперимент, рецепт которого был найден на просторах Сети. Цель эксперимента – выявление «дыр» в расширении SexyPolling для Joomla! (https://extensions.joomla.org/extension/sexy-polling/). Само по себе расширение довольно дырявое и подвержено SQL Injection, мы не рекомендуем его к использованию. Но в ходе проведения эксперимента были выявлены дополнительные «дыры», никак не связанные с SQL Injection.

Первым делом смотрим, как организована кнопка «Голосовать». В случае с SexyPolling это было так:

5.png

Смотрим код страницы. По понятным причинам «все лишнее» закрыто.

Как видишь, классической формы нет, обработкой нажатия кнопки занимается JavaScript-сценарий. Судя по всему, он и передает твой голос на сервер. Смотрим в <head> сценарии (хотя сценарии могут быть определены и в конце страницы). Ищем сценарий, содержащий в названии polling, poll, voting и т.д.

6.png

Определяем сценарий голосовалки

По названию этого файла можно понять, с чем имеешь дело. Определив сценарий голосовалки, можно нагуглить инфу о его уязвимостях.

Смотрим код сценария, чтобы понять, как он устроен. Видим, что обработка IP-адресов (попытка узнать регион и т.д.) осуществляется на стороне клиента, то есть в JavaScript:

7.png

Далее стало понятно, какому сценарию передается выбранный пользователем вариант ответа, а также параметры, которые ему передаются:

8.png

Далее можно попробовать передать ему эти параметры вручную. Нужно вычислить было только два значения – это ID голосования (параметр polling_id) и номер ответа. Это можно сделать путем просмотра кода страницы. Вот ID голосования:

9.png

Вычисляем ID голосования

Теперь находим ID ответа. Вкладка Elements в инструментах разработчика Chrome нам поможет.

10.png

Вычисляем ID ответа

Самый простой способ передачи POST-запроса (а судя по JavaScript-коду отправляется именно POST-запрос) – обычная HTML-форма. Подойдет вот такая формочка:

<form action="http://сайт/components/com_sexypolling/vote.php&amp;quot; method=post>
<input type=text name="polling_id" value="1821">
<input type=text name="sexypolling_token" value="1">
<input type=text name="answer_id[]" value="1256">
<input type=submit>
</form>

Передаются ID голосования, номер ответа и параметр sexypolling.

Открываем HTML-файл в браузере (желательно через Tor, чтобы не светить свой IP) и нажимаем кнопочку Submit. Далее смотрим на счетчик – о чудо – он увеличился! Да, если бы расширение было бы написано правильно и перед увеличением счетчика проверяло бы IP-адрес, то ничего бы не вышло. А оно было организовано иначе – сначала JS проверяет IP и отображает красивый счетчик времени до следующей попытки, если человек уже голосовал с этого IP, или же «дергает» сценарий vote.php, который просто увеличивает счетчик нужного кандидата. И ему все равно, сколько вы отправили запросов – хоть 100, хоть 10000 с одного IP.

11.png

Форма в браузере

Автоматизируем

Нажимать кнопочку – это тоже работа, поэтому можно автоматизировать сей процесс: 

<?php
if( $curl = curl_init() ) {
    curl_setopt($curl, CURLOPT_URL, 'http://сайт/components/com_sexypolling/vote.php');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, "polling_id=1821&sexypolling_token=1&answer_id[]=1256");
    $out = curl_exec($curl);
    //echo $out;
    curl_close($curl);
}
?>

Это простейший PHP-сценарий, отправляющий POST-запрос сценарию vote.php. Думаю, сценарий понятен без каких-либо комментариев. Если у тебя есть вопросы, обратись к документации по PHP.

Далее нужно обеспечить автоматический запуск этого сценарий. Если ты счастливый пользователь VDS от Xelent или же у тебя на домашнем компе установлена Linux, самым правильным способом будет добавить вызов PHP-сценария (у меня он называется test.php) в расписание cron:

crontab -e

12.png

Расписание cron

В данном примере сценарий запускается каждые 5 минут. То есть каждые 5 минут твой кандидат получит голос. При желании можно запускать этот сценарий каждую минуту или вообще организовать цикл и добавить любое количество голосов сразу. Здесь уже как захочешь.

Если же у тебя есть обычный хостинг, можешь «залить» PHP-сценарий накрутки на хостинг, установить в браузер расширение перезагрузки страницы (вроде Page Reload) и настроить его на перезагрузку страницы со сценарием каждые несколько минут. Для сокрытия своего IP можно использовать Tor Browser. 

Как защититься от взлома?

Есть три рекомендации:

  1. Установить самую последнюю версию голосовалки. Есть шансы, что все известные «дыры» уже залатаны.
  2. Погуглить и попытаться найти информацию об уязвимости используемого компонента. Попытаться исправить «дыры» самому или обратиться к спецам.
  3. Конкретно в случае SexyPolling – сменить на другой компонент. Если уж сильно хочется использовать именно его, добавь в код vote.php проверку региона/страны. В самой голосовалке есть возможность ограничения по стране, но ограничение не проблема обойти, поскольку сам vote.php не осуществляет такую проверку. Выше было показано, как организовать проверку региона/города по IP-адресу. Подобную проверку нужно добавить в код vote.php: 

    if (get_geo_city($ip)!=="Moscow") die();

Вместо die() можешь организовать редирект на страничку, на которой можешь изложить все, что ты думаешь по поводу накрутки:

if (get_geo_city($ip)!=="Moscow") header('Location: nakrutka.html');

Чтим уголовный кодекс

Цель эксперимента – показать, как легко можно произвести накрутку счетчика голосования при условии наличия уязвимостей в системе голосований, и описать способы защиты от противоправных действий. Ни одна реальная система не пострадала и весь процесс производился в лабораторных условиях – на локальных машинах.

Желающим проверить данный эксперимент в реальных условиях, нужно ознакомиться со статьей 274 УК РФ.

    


Получить консультацию специалиста
Персональный ассистент
Cloud.Xelent