CRITICAL STORED · скрипт, который ждёт, пока его откроют
>> я написал в «о себе» не текст · я зашил туда голос, который заговорит в чужом браузере
В поле «о себе» разрешено писать всё. Любой символ, любой тег, любую инструкцию
для браузера. Сервер принимает, сохраняет, и каждый раз, когда кто-то открывает мой
профиль, возвращает это обратно дословно — ни одной
замены, ни одного экранирования, ни единого фильтра.
Сам MAX в окне редактирования аккуратно показывает это как текст — ничего
страшного. Но поле не живёт только в этом окне. Его читают другие
интерфейсы: карточка контакта при чужом просмотре, мобильное приложение,
внутренние панели саппорта и антифрода, интеграции с mini-apps, выгрузки в
отчёты. Везде, где рендерер хоть на миллиметр проще — зашитый голос начнёт
говорить. И говорить он будет от имени того, кто
открыл.
Самый болезненный слушатель — оператор службы поддержки. Он открывает мой
профиль по жалобе, его панель рендерит моё «о себе» без защиты — и в его
браузере исполняется мой сценарий. Его сессия, его куки, его IP теперь
в моих руках. Голос ушёл в штаб.
>> impact · blind-XSS в admin/support · кража саппорт-сессии при открытии профиля · потенциал доступа ко всей ленте жалоб и модераторских действий
[01]SCOPEENFORCED
scope := VK_Bug_Bounty(*.max.ru) · пределы подписаны, за черту не ступаю
[02]NO_HARMVERIFIED
read_only := true · ни одного чужого профиля не тронуто
[03]SELF_ONLYMY_BIO
target := @exreddit.bio · сохранение в своё поле, свой аккаунт, своё имя
[04]PAYLOADMARKER
script → my.callback · скрипт уходит на мой приёмник, никуда больше
[05]NO_VICTIM0 OPENED
viewer_count := 0 · я не посылал жалоб, не тегал саппорт, не провоцировал открытие
[06]PROOFSTORED
доказательство = raw дамп сервера, возвращающего мой payload дословно · без выполнения
[07]CLEANUPREVERTED
profile.description := default · голос вынут из поля после submit отчёта
[08]REPORTSUBMITTED
отчёт → VK Bug Bounty · full disclosure владельцу · без побочных каналов