Баг в ВК, или Как поступить на факультет пиратов в МГУ
- вторник, 10 декабря 2024 г. в 00:00:16
Привет! Меня зовут Василий Брит, и я уже почти пять лет работаю программистом в компании 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. Пара интересных факультетов, на которые можно поступить: раз и два.