Привет! Меня зовут Василий Брит, и я уже почти пять лет работаю программистом в компании Positive Technologies. Сегодняшний рассказ будет про веселый баг про веселую фичу на vk.com, которая существует больше 10 лет.
В современном программном обеспечении множество багов. Какие-то из них влияют на безопасность, какие-то на работоспособность, но есть отдельная категория, которую я называю «Веселые баги». Они не влияют на других пользователей и на работоспособность системы в целом, но могут принести много эмоций тому, кто их использует, а также тем, кто наблюдает за получившимся результатом.
Все началось пару дней назад, когда ко мне в предложку ВК попал мой первый руководитель, с которым мы не виделись уже несколько лет. Перейдя в профиль, я увидел следующее:
То, что ему 122 года, меня не удивило ? А вот то, что он учился в Сомалийском Университете Пиратства и Абордажного Судозахвата, — весьма. Мы всегда пользовались и пользуемся лицензионным ПО, поэтому я сразу смекнул, что ни на какого пирата он не учился, но на всякий случай поискал информацию об этом «университете» в Гугле (ничего не нашел).
Дальше я попробовал через веб-интерфейс в своем профиле поставить такое же высшее образование, но такого университета в списке доступных не нашлось ?
Оказалось, что сейчас в ВК данные о вузах нельзя добавлять без предварительной проверки модераторами. Хочешь добавить новый университет — делай заявку, ее рассмотрят и, возможно, одобрят. Выбор университета доступен по списку из провалидированных данных. Но откуда тогда взялся университет пиратства?
Очевидно, раньше в ВК были проблемы с валидацией полей, отвечающих за раздел с информацией о высшем образовании, и пользователи могли писать в эти поля что угодно. Осталось лишь найти лазейку, которая в текущих условиях зачислит меня в тот самый университет.
Начинаем
Раздел о высшем образовании содержит пять полей.
Поле «Город»
Когда мы начинаем вводить символы в это поле, на бэкенд улетает запрос вида https://vk.com/select_ajax.php?act=a_get_cities&country=0&ignore_country=1&str=<символы, которые вы вводите в поле>
Пример для Москвы: https://vk.com/select_ajax.php?act=a_get_cities&country=0&ignore_country=1&str=москва
После выбора города из выпадающего списка отправляется запрос (строка ниже) и появляется поле «Вуз», где в выпадающем списке будут перечислены все вузы, полученные из запроса: https://vk.com/select_ajax.php?act=a_get_city_info&city=1&fields=8
Поле «Вуз»
С данного поля и начинается ограниченная выдача результатов. Если при заполнении поля «Город» происходит полнотекстовый поиск по всем доступным городам, то при заполнении поля «Вуз» полнотекстового поиска уже нет, и приходится выбирать из имеющихся вариантов. Для Москвы мы можем выбрать МГУ, в этом случае выполнится запрос https://vk.com/select_ajax.php?act=a_get_uni_info&uni=2 и появится поле, где нужно будет выбрать факультет.
В GET-запросе передается параметр uni со значением 2. Под идентификатором 2 скрывается МГУ. А если заменить двойку, например, на 555555, что мы тогда получим?
https://vk.com/select_ajax.php?act=a_get_uni_info&uni=555555
Ага, университет с факультетом Counter-Strike 1.6! Очень интересно. В этот момент я еще не был уверен, что данное значение добавилось кем-то в систему без валидации, но пройдясь по соседним идентификаторам, я увидел «позитивных людей:)», и пазл сложился.
Когда-то в ВК была возможность добавлять произвольные строки в поле названия университета и во все дочерние поля.
В определенный момент такую возможность решили убрать и сделали фикс на уровне поля «Город», добавив каждому значению четкий список доступных вузов, факультетов и т. п.
Старую кучу созданных пользователями значений никто не удалил, и она осталась доступной (возможно, ее никто не удалил, чтобы профили, в которых эти значения отображаются, не сломались).
Таким образом, из-за того, что сущности «Город» и «Университет» жестко связаны, сейчас поставить себе в профиле «Сомалийский Университет Пиратства и Абордажного Судозахвата» будет невозможно, так как этот университет привязан к городу с идентификатором 0, а его выбрать нельзя.
Теперь к лазейке
Если между сущностями «Города» и «Университета» есть жесткая связь, то все последующие сущности («Факультет», «Специальность», «Год выпуска») жестких связей с предшествующими сущностями не имеют. Таким образом, для любого провалидированного университета можно выбрать абсолютно любой из доступных факультетов. Но как?
Переходим к практике
При выборе факультета у нас появляется выпадающее меню с ограниченным списком значений, куда произвольное значение подставить нельзя.
Но если посмотреть код страницы, то можно увидеть, что у каждого поля с названием факультета есть атрибут val. В этом атрибуте и хранится идентификатор выбранного факультета.
Из запроса https://vk.com/select_ajax.php?act=a_get_uni_info&uni=556340 мы помним, что ID «позитивных людей:)» — 1077453. Попробуем подставить его в код страницы, после чего в интерфейсе выберем измененное поле.
Подмена ID:
Результат:
Бинго! У нас что-то получилось! Название факультета, правда, нечитаемое, но у нас появилось следующее поле («Специальность»), а это значит, что мы на верном пути.
Выберем поле «Специальность»:
Интерфейс нам предлагает выбрать специальность «глобального смеха:))».
На этом можно было бы остановиться и нажать кнопку «Сохранить», но я решил еще разок взглянуть на код страницы и нашел скрытые поля «Форма обучения» и «Статус»:
Если убрать display: none
, то поля появятся, но выбора в них не будет.
Дальше я поискал, какие ID бывают у значений в полях «Форма обучения» и «Статус».
Нашел, что, указав значение 1 в поле с формой обучения и 10 в поле статуса, получим форму обучения «Очная» и статус «Доктор наук»:
После нажатия кнопки «Сохранить» профиль обновляется, и при переходе на вашу страницу можно увидеть заветные фразы:
В заключение я нашел, какие факультеты есть в том самом университете пиратства, и выбрал один из предложенных вариантов. Итоговая страница профиля стала выглядеть так:
Итоги
Статья не направлена на то, чтобы кого-то оскорбить или принизить, а создана лишь в научно-развлекательных целях. Не пытайтесь повторить в домашних условиях (но если повторите, то скидывайте в комментарии ваши факультеты, оценим всем Хабром).
P. S. Пара интересных факультетов, на которые можно поступить: раз и два.
Комментарии (14)
lotta
08.12.2024 17:22а ВК в курсе такой фишки?
Capitan_grach Автор
08.12.2024 17:22Конечно! Мы за безопасный мир, а даже небольшие баги могут серьезно навредить любой компании. Поэтому перед публикацией отчет о баге был отправлен в службу безопасности ВК. После ответа, что баг не может привести к проблемам с ИБ, статья и была опубликована)
vasily-v-ryabov
08.12.2024 17:22Видел чуть попроще приколы. Аккаунт с именем «Голова Головушка», и в семейном положении: «всё сложно с Головой Головушкой».
neit_kas
08.12.2024 17:22В стародавние времена у ВК и более полезные баги были. В статью оформлять не буду, ибо не актуально совсем, но тут расскажу.
Было время, когда в ВК только зарождалась передача файлов. Некоторое время к сообщению можно было прикрепить только документ, включая MS Word. И вот подумалось мне, а почему бы не устроить из них контейнер? Docx - это по сути обычный zip. Значит можно допихнуть. С другом попробовали передать - получилось.
Хотелось user friendly, чего-то в духе SFX модулей архивов. Word'овские документы могут содержать макросы. docx в макросы не могёт, а docm не прикреплялся (видимо пытались защитить пользователя от вякой макро гадости). Что ж, есть doc (который compound). Он поддерживает макросы. Но, увы, он уже не zip. Задумался. Придумал привинтить zip архив в конце. При такой структуре все известные мне на тот момент архиваторы игнорили compound часть и открывали zip.
Начал писать VBA скрипт самораспаковки. алгоритмы zip на VBA делать очень не хотелось, но и предлагать поставить что-то пользователю в системе тоже. Выкрутился при помощи zipfldr.dll. В данном процессе, не помню зачем, но нужно было себя скопировать. Оказалось тоже не совсем тривиальной задачей. Стандартными средствами были какие-то ограничения на самокопирование. Выкрутился при помощи FSO (File System Object).
В планах ещё было написать что-нибудь, что прикручивалось бы к архиваторам в виде SFX. Так как doc переименованный в exe в таком виде работать отказался, была мысль реализовать полноценный exe, в котором собрать гамбургер из собственно exe файла, doc файла и нашего zip архива. Идея состояла в том, что после упаковки в SFX архиватором пользователь должен запустить этот SFX, который превратится в doc с присоединённым zip'ом, который уже можно будет отправлять.
Но вскоре после этого ВК ввели полноценную передачу файлов, и этой лазейкой полноценно по пользоваться так и не вышло.
cspbxm6
08.12.2024 17:22Действительно, что-то автор опоздал на 10 лет. Может кто-нибудь подскажет, какие сейчас имеются методы, чтобы поставить пустой символ в поле имени? Примерно год назад была такая фича в вк, но уже ничего не работает. Даже была возможность сделать галочку с пустым именем.
anador
"Колесо сансары делает оборот"
Статья действительно на уровне "Крутые приколы ВКонтакте 2010", конечно. Теперь про все баги 15-летней давности пора по новой статьи писать? Хоть ретроспективу бы включить тогда, чтобы можно было поностальгировать
Списки подобных id вузов с того времени и существуют, хотя подозреваю, что значительно поредевшие.
Пример
У меня вот за 2011 год нашлась заметка с такими списками id'шников. Кажется, ~ до 2009 можно было писать свои без enum, потом уже использовали те, что создали ранее. Популярным городом для таких вузов, кстати, был Hong Kong.
Еще же есть такие же школы, войсковые части и пр. Или жир в заметках вспомнить, авось еще работает.
p.s. qweqwe, привет
Capitan_grach Автор
Спасибо за комментарий! В 2010 я ещё был чиловым парнем из начальной школы и о данных особенностях ВК не знал) Уверен, что я такой не один. Как раз для такой аудитории и написана статья
Capitan_grach Автор
Ещё важное замечание: вы в примере привели коды ВУЗов. Я в статье отмечал, что произвольные ВУЗы сейчас выбирать нельзя, баг начинается только с поля Факультет. Т.е. просто повторить действия из 2010 не выйдет, так как исходный способ пофиксили
IGR2014
Статья показывает качество продукта, так сказать. Костыли из 2010-х всё ещё удачно эксплуатируемы в 2020-х спустя 15 лет))