Все очень просто — если мы можем перелогинить пользователя в свой фейсбук то мы можем присоединить свой фейсбук к аккаунту жертвы на других вебсайтах. Жертва загружает нашу страничку и мы получаем доступ к аккаунту жертвы на Booking.com, Bit.ly, About.me, Stumbleupon, Angel.co, Mashable.com, Vimeo и куче других вебсайтов.
Шаг 1. Загрузка этого URL www.facebook.com/n/?mid=9dd1fd7G5af48de9ca58G0G86G119bb48c разлогинит любого пользователя FB
Шаг 2. Чтобы залогинить жертву под нашим аккаунтом фейсбук требует Origin=*.facebook.com при запросе на login.php. Origin передается самим браузером и содержит домен страницы откуда произведен запрос. Другими словами нам надо найти способ сделать POST запрос с самого фейсбука. Для Firefox этого не нужно — он не отсылает Origin вообще для обычных form-based запросов. Поэтому дальше хак специально для Хрома.
Создадим Canvas приложение с такими настройками:
Когда жертва попадает на apps.facebook.com/482922061740192 фейсбук шлет POST запрос по данному URL (должен быть не на facebook.com). Мы в свою очередь используем 307 редирект (сохраняет HTTP verb в отличии от 302) и это приводит к POST запросу на www.facebook.com/login.php?email=attacker@email.com&pass=password вместе с Origin: apps.facebook.com и нашим логином/паролем. Теперь жертва залогинена в наш фейсбук аккаунт.
Step 3. Осталось запустить процесс коннекта. Обычный
<img src="http://victim.com/auth/facebook">
сработает.Теперь когда наш фейсбук подключен к аккаунту жертвы мы можем напрямую зайти в аккаунт жертвы, отменять бронирования на booking.com или читать личные сообщения, или сменить пароль.
Данный простой баг использует три CSRF одновременно — на логауте, логине и на присоединении социального аккаунта. Первые два должен исправить фейсбук (но они отказались, это WontFix), последнее это задача самого разработчика.
Reconnect это инструмент для угона аккаунтов, можете копировать код и ломать кого угодно — мне не жалко. В качестве примера используются Booking.com, Bit.ly, About.me, Stumbleupon, Angel.co, Mashable.com, Vimeo, но любой другой вебсайт с Facebook Connect может быть уязвим. Например, все Rails сайты, использующие omniauth-facebook, уязвимы.