В течение нескольких лет вы могли сменить пароль любому другому пользователю Facebook, просто изменив элемент profile_id в форме fbMobileConfirmationForm при аутентификации с мобильного телефона. Сама форма находится здесь.
Специалист по безопасности Джек Уитттен (Jack Whitten) в своем блоге объясняет суть бага, который связан с неправильной обработкой параметров скриптом /ajax/settings/mobile/confirm_phone.php для подтверждения номера телефона, который привязывается к аккаунту.
Один из принимаемых скриптом параметров — profile_id с указанием аккаунта, для которого осуществляется процедура.
В общем, эксплойт простой. Привязываем телефон к своему аккаунту, получаем код подтверждения.
Вводим этот код в форму активации здесь и изменяем элемент profile_id внутри, указав профиль жертвы.
При отставке запроса можно заметить, что значение __user (наше) отличается от profile_id (жертва).
Тем не менее, бэкенд благополучно скушал этот запрос — и нам приходит SMS с подтверждением, хотя мы уже привязались к чужому аккаунту.
Теперь можно поменять ему пароль.
Подтверждение о смене пароля тоже приходит на телефон.
28 мая 2013 года уязвимость устранили. Хотя воспользоваться багом уже нет возможности, но интересен сам факт, что такое было возможно в течение длительного времени. Компания Facebook выплатила $20 тыс. за информацию об этой уязвимости, что говорит о ее чрезвычайной опасности.
А сколько таких багов еще осталось?