22.10.2013

»стори€ о XSS в Facebook

image

 ак-то вечером € решил исследовать безопасность Facebook. ѕосле недолгого хождени€ по порталу мой взгл€д зацепилс€ за Graph API Explorer. Ёто веб-приложение дл€ работы с Facebook Graph API, которое позвол€ет получать пользовательские данные от Facebook и загружать их на Facebook.  онечно, многие операции доступны только при наличии OAuth-токена. „то же это приложение на самом деле делает?

јвтор: ѕавел “опорков, Positive Research

 ак-то вечером € решил исследовать безопасность Facebook. ѕосле недолгого хождени€ по порталу мой взгл€д зацепилс€ за Graph API Explorer. Ёто веб-приложение дл€ работы с Facebook Graph API, которое позвол€ет получать пользовательские данные от Facebook и загружать их на Facebook.  онечно, многие операции доступны только при наличии OAuth-токена. „то же это приложение на самом деле делает?

image

 огда пользователь делает какой-либо запрос на получение или отправку данных, приложение посылает JSONP-запрос наgraph.facebook.com, при этом добавл€€ callback, который будет отрисовывать полученные данные на странице. ѕервым делом € попыталс€ подменить этот callback на что-то свое (подробнее об этом методе), — но безуспешно, так как callback-параметр, который € внедр€л, просто отбрасывалс€. ѕосле нескольких неудачных попыток внедрить callback € вспомнил об одной интересной странице Ч "login.php", на которую наткнулс€ в процессе исследовани€ Facebook. Ёта страница встречалась на всех доменах и позвол€ла выполнить redirect на любую страницу любого поддомена facebook.com. ƒл€ начала € попробовал сделать redirect на тот же graph.facebook.com, но со своим callback-параметром.

https://developers.facebook.com/tools/explorer?method=GET&path=login.php?next%3dhttps%253a//graph.facebook.com/me%253fcallback%253dalert

я увидел заветное окошко с текстом [Object object], которое свидетельствовало, что мой callback исполнилс€. Ќо €, конечно же, не мог на этом остановитьс€. “еперь € зан€лс€ поиском места в Facebook, где € мог бы сохранить свой JavaScript-код, чтобы потом его исполнить. ѕервое, что пришло мне в голову, Ч отправить файл с сообщением какому-либо пользователю, подменив Content-Type на text/javascript. ѕосле этого мы получаем ссылку вида

https://www.facebook.com/ajax/messaging/attachment.php?attach_id=<ID>&mid=<MID>&hash=<HASH>

котора€ перенаправл€ет нас на

https://attachment.fbsbx.com/messaging_attachment.php, где хранитс€ наш код. Ётот код доступен только дл€ отправител€ и получател€ сообщени€, но, как известно, злоумышленник может сделать GIF-изображение, которое будет содержать в себе JavaScript-код (пример). «лоумышленник может отправить такой GIF-файл жертве, получить ссылку на него и использовать затем эту ссылку дл€ эксплуатации у€звимости. ∆ертва в свою очередь увидит только картинку и не заметит ничего подозрительного.

»так, пробуем исполнить наш код… Ќичего не вышло. ƒело в том, что Facebook указывает заголовок "content-security-policy", который позвол€ет браузеру выполн€ть только JavaScript, полученный от определенных доменов. я расстроилс€ и уже начал искать другое место дл€ хранени€ своего кода, как вдруг вспомнил, что Internet Explorer игнорирует этот заголовок. ¬место него он требует заголовок "x-content-security-policy". ѕробуем исполнить наш код в IE10 и видим следующий результат:

image

”ра!  од исполнилс€. я сообщил об этой у€звимости в Facebook, и она была довольно быстро исправлена, а € не удержалс€ от того, чтобы сделать скриншот.

image

¬идео эксплуатации:


или введите им€

CAPTCHA