[Из песочницы] После логаута пользователя VK можно получить управление его страницей
Один из способов авторизации в API — это OAuth. Вкратце всё происходит так: создаёте приложение ВК, получаете его ID, а затем отправляете браузер пользователя на адрес:
https://oauth.vk.com/authorize"
+ "?client_id=123" // ID вашего приложения
+ "&display=page"
+ "&redirect_uri=https://oauth.vk.com/blank.html" // URL, на который попадёт пользователь после успешной авторизации. ВК требует указания этого сайта в настройках приложения и только для приложения типа Сайт. Для остальных работает только указанный УРЛ, в целях безопасности
+ "&scope= права доступа"
+ "&response_type=token"
+ "&v=5.52"
+ "&state=1CtoVK"
Если пользователь залогинен, ему будет сразу предложено установить приложение, если нет — вначале залогиниться, а уже потом устанавливать. Если приложение уже установлено, то идёт сразу переход на страницу, в хэше которой будет токен. Дальше идёт работа с API.
Самое интересное начинается после выхода из ВК. Ваше приложение может иметь ссылку на выход вида vk.com/login.php? op=logout. Это стандартная ссылка на выход из VK. Но после выхода пользователя из VK куки остаются рабочими.
Таким образом, если опять показать страницу авторизации, ввести совершенно другой логин и пароль — вы всё равно сможете пользоваться страницей первого пользователя.
Самое смешное то, что вы можете использовать в вашем приложении самые безобидные права. То есть не нужно пугать пользователя тем, что вы просите доступ к фоткам, аудио, видео, сообщениям и всему остальному. Можно оставить только базовые — и всё. Куки при этом всё равно будет полностью рабочими, используя их вы попадёте прямиком на страницу пользователя.
Можно ли считать данную особенность уязвимостью — думайте сами. По-моему, это как минимум не то, чего ожидает пользователь, нажимая на кнопку «Выход» и надеясь на то, что теперь уж его страница в безопасности.
При написании данной заметки ни один пользователь ВК не пострадал.
UPD. При авторизации использовался браузер IE7.
В поддержку я писал задолго до того, как опубликовал статью на здесь. Собственно, публикация статьи здесь и произошла в результате того, что поддержка данный сигнал проигнорировала в духе «это не баг, а фича, но, возможно, что-то изменится в будущем».
Комментарии (11)
25 июля 2016 в 08:40
+1↑
↓
А разве у ВК нет программы оплаты за найденные уязвимости?
Ваша заметка как раз похожа на такое.25 июля 2016 в 08:54
0↑
↓
Они ещё и перманентно банят тех, кто не пишет им, а эксплуатирует и публично распостраняет25 июля 2016 в 09:15
+2↑
↓
Никаких специальных окошек для обращения за оплатой за баги я не нашёл. В поддержке же (куда я обратился задолго до этой публикации) мне сказали, что это не баг, а фича. Поэтому «умываю руки».25 июля 2016 в 10:17
0↑
↓
Плохо искали: hackerone.com/vkcom. Полгода назад получил $200 за весьма несерьёзную уязвимость. Правили долго, правда.25 июля 2016 в 10:18
+1↑
↓
Как наивный пользователь, я полагал, что окно с описанием уязвимостей находится на самом сайте ВК.
25 июля 2016 в 09:02
0↑
↓
Здесь нет бага. Вы путаете два не связанных механизма.
OAuth для авторизации сторонних приложений и авторизацию/разлогин самого сайта.Фактически сайт ВК это такое же приложение и вы разлогинитесь в нем, вместо своего.
Чтобы сделать разлогин для токена вам нужно использовать методы API с указанием токена, если такие там предусмотрены.
25 июля 2016 в 09:25
0↑
↓
Но почему тогда при попытке повторного логина через API же я получаю окошко логина? Если у них мухи отдельно от котлет, тогда и куки, по идее, должны быть как-то тоже разделены и не иметь областей взаимодействия. Но область взаимодействия здесь как раз есть — логин осуществляется через браузер и для браузерного просмотра, и для работы с API.Не претендую на экспертное техническое мнение, но мне кажется, что если я разлогинился, то я не должен иметь доступ к информации аккаунта, тем более чужого. А в приведённом в статье примере я разлогиниваюсь, при запросах к API получаю предложение авторизоваться, но когда авторизуюсь, получаю полный доступ к аккаунту пользователя, который был авторизован до меня. Причём как из своего приложения, так и просто через браузер.
25 июля 2016 в 09:41
0↑
↓
В приведенном коде авторизации вы используете Implicit flow. Иными словами это локальная авторизация приложения. Access_token который вы получили, хранится у вас в браузере и сервер или кто угодно еще не имеют к нему доступа. При попытке повторной авторизации вы инициируете создание ЕЩЕ одного токена.Так как у вас в статье нет ни какой подробной информации о последующем доступе к странице пользователя, уверен, что дальше базовых прав, которые вы дали токену при его создании, вы не получите. Это основной принцип OAuth.
25 июля 2016 в 09:47
0↑
↓
Более того, неправильно обвинять кого-то в уязвимости управления страницей после разлогина, не предоставив подробного описания с приведенными доказательствами и тем более писать не им, а публично. А то, что OAuth создавался в том числе и для управлять — это да.25 июля 2016 в 09:51
0↑
↓
В том-то и весь сыр-бор — я получаю полный доступ, причём через браузер.Авторизуюсь под пользователем П1 через API.
Разлогин под пользователем П1.
Дальше любые попытки отправить запрос в API или зайти через браузер оканчиваются требованием авторизоваться.
Авторизуемся под пользователем П2 через API.
Заходим в браузер (через который авторизовывались) и получаем полный доступ к аккаунту пользователя П1 (не П2, под которым заходили)! Даже не смотря на то, что авторизовались якобы для использования API и даже могли самые скромные права затребовать для своего приложения.
25 июля 2016 в 10:07
0↑
↓
Таким образом, если опять показать страницу авторизации, ввести совершенно другой логин и пароль — вы всё равно сможете пользоваться страницей первого пользователя.
Вот и сошлось. Я думал, это только у меня такие странности ИНОГДА происходят. У меня и у жены есть аккаунты в ВК. Она обычно не выходит, а просто браузер закрывает (firefox). А мне приходится при открытии ВК нажимать «выход» и потом логиниться под собой. Так вот, уже много раз было так, что после ввода своего логина и пароля я попадаю в её аккаунт. Со всеми правами. При этом к своему аккаунту уже не имею доступа. Не помогает ни обновление страницы, ни чистка кэша/куков. Повторно выхожу-захожу — опять то же самое. Помогает чаще всего выход, чистка куков и смена внешнего IP (выключить-включить роутер). Иногда просто нужно подождать какое-то время.
Но это далеко не всегда происходит. В последние месяцев 4–5 не замечал такого, но ранее — как минимум раз в месяц попадалось.