Данный пост — небольшой отчет о процессе реверсивного проектирования и анализе работы самой популярной соц. сети в СНГ — vk.com. В основном анализ проводился со стороны безопасности (хотя сама соц. сеть весьма привлекательна как high-load проект, безусловно). Для себя вынес некоторые интересные решения и просто получил удовольствие. Пост получился, возможно, немного сумбурный, так углублялся просто в интересные мне моменты.
Содержание
Общее зрение
Архитектура
- php 5.2/5.3
- Периоды нагрузки (отключения автоподгрузки ленты)
- Врапперы в сообщениях
- Разный код для мобильной и полной версии
Security
- Фичи
- Авторизация
- Anti-CSRF токены
- Запрет iframe
- Отключенный POST на контент-серверах
- Фиче-баги
- Узнать возраст через поиск
- Баги
- XSS
- Загрузка документов без имени
- Подгрузка по ajax фото из закрытых альбомов (?)
- Не везде anti csrf
Разное
Общее зрение
Прежде всего стоит прочесть парочку хоть и старых, но интересных статей:
- Две очень похожих статьи — [1], [2]
- Немного другая сторона — spb-borodin.livejournal.com/596.html
После включения firebug'a и посмотрев сайт просто со стороны веб-разработчика, сразу становится видно, что внутри некоторый бардак (к нему мы еще вернемся в конце статьи), отсутствие диспатчеров (возможно, для снижения нагрузки), разбросанные стили и js файлы и многое другое. А в целом — незамысловатое веб-приложение, использующее в нагруженных местах nodejs, а для остального «стандартные» (я бы даже сказал «заезженные») технологии разработки (исключая их нераскрытую бд. Настройку балансировщиков так же откидываю).
Архитектура
- php 5.2/5.3
По ходу работы с приложением, в зависимости от того, на какой бэкенд мы попадаем, мы натыкаемся на разные версии php (5.2/5.3). Т.е. это скорее всего говорит о том, что версия php меняется скорее из-за фикса различных багов в самом интерпретаторе, чем из-за нововведений в php 5.3. Кстати, установлен suhosin - Периоды нагрузки (отключения автоподгрузки ленты)
Скорее всего написан некоторый монитор, который смотрит за нагрузкой и динамично балансирует конфиги скриптов. Например, ближе к вечеру отключается автоподгрузка ленты, которая при нескольких млнов юзеров может значительно снизить нагрузку. - Врапперы в сообщениях
Фича добавления разного контента в сообщениях сделана довольно примитивно, но может это и верно. При добавлении видео отправка сообщения выглядит подобным образом:
act=a_send&al=1&chas=XXXXXXXXXXXXXX&from=box&media=video%3A-22558194_163667075&message=&title=&to_ids=6254003
Т.е. просто указывается тип аттача (video, audio, map etc...) и внутренняя ссылка на него. А долго копался с этим моментом, пытаясь что-нибудь туда подсунуть — не вышло. - Разный код для мобильной и полной версии
Это, возможно, очевидно, но не есть гуд. Скорее всего из-за низкой абстракции кода, которая не позволяет просто взять метод и вызвать его на другом (например мобильном) интерфейсе. Тому есть подтверждения, например разные переводы (статус «не женат/не замужем» в полной версии переведен на английский как «Single», а в мобильной — «Not married». Писал на это тикет). Но это только шаблоны, есть и другие моменты, которые косвенно указывают на различный код (возможно код, просто урезанно-дублированный)
Security
Прежде чем начать этот раздел я сделаю отсыл на пост Евгения Касперского, хотя некоторые моменты уже неактуальны — e-kaspersky.livejournal.com/70000.html
- Фичи
- Авторизация
Это просто первым пунктом. Авторизация проходит по следующей схеме — action формы ведет по https на login.vk.com, там выставляет куку для себя (https://login.vk.com) и для vk.com (remixsid). Если с кукой на «рабочем» домене что-то не то (изменена, не совпал последний IP и т.п), автоматически происходит редирект на login.vk.com. И если пароль действительно вводился на этом браузере, там будет persistent-кука (которая выставилась при вводе оригинального пароля), по которой произойдет автоматический вход. Если же нет (к примеру, куки увели и зашли с другого ip) то на аккаунт не пустит. Кстати, когда нашел XSS с этим погорячился. По факту увод куков не дает ничего (конечно, если это не XSS на login.vk.com). Так же ведется запись последних активных сессий — 6 штук, который считаются «живыми» - Anti-CSRF токены
Считаю (думаю, не только я) наилучшей защитой от CSRF именно этот метод. Но как они его красиво реализовали… Первый момент стандартен, на любое действие генерируется уникальный код для юзера, который невозможно предугадать. Но здесь же особенность токенов состоит в том, что они зависят от параметров действия. В данном случае у нас есть — from_id, to_id, action_id и иногда еще некоторые параметры. От всех них берется хэш (скорее всего какая-то своя быстрая 72-битная хэш-функция), скорее всего добавляется соль (статичная?) (хотя, в последнее время явным образом from_id не передается) и добавляется в форму. Т.е. на каждое действие с разными параметрами — разный токен. - Запрет iframe
Собственно, сабж. Сайт нельзя отобразить в iframe, что правильно. Запретить отображение сайта в iframe можно различными способами - Отключенный POST на контент-серверах
В силу разных причин это верно ограничивать сервер доступными методами. На всех контент серверах отключен POST
- Авторизация
- Фиче-баги
- Узнать возраст через поиск
Маленький трюк. Если у человека заполнен возраст, но выставлено не отображать его — то его можно узнать, если найти человека через поиск и начать подбирать возраст (фильтром). Наверное, гипер-бородая фиче-бага.
- Узнать возраст через поиск
- Баги
- XSS
Наверное, все началось с того, что я захотел найти XSS, лично для себя. Она была найдена в основном модуле сайта — поиск. Вектор был таким:
http://vk.com/search?c%5Bage_from%5D=alert(String.fromCharCode(88, 83, 83, 32, 101, 120, 97, 109, 112, 108, 101, 33))&c%5Bname%5D=1&c%5Bsection%5D=people
Скрин алерта
Исходный кодЧисло для поиска возраста в чистом виде подставлялось в js-функцию параметром. Единственное ограничение, которое я здесь «словил» — это невозможность использования кавычек (они преобразовывались), что легко обходится строковыми функциями. Поправили буквально за день-два. «Баунти» программы у них нет. В ответ было мол — поправили, проверьте и всё. P.S. Сниффер успешно внедрился, но это ничего не дало, из-за первого пункта про систему авторизации.
- Загрузка документов без имени
Эту багу и следующую так и не хватило времени доисследовать. Но что-то и так уже статья постоянно откладывалась, так что как есть. При загрузке документов он смотрит на расширение файла и или принимает файл, или нет (ессно, я пытался загрузить htaccess и переназначить роли файлов по расширению). Возникла бага с файлом .model Скрипт его пропустил, но он всегда «404» - Подгрузка по ajax фото из закрытых альбомов (?)
Создав ajax-запрос на нужный документ мы можем получить полное изображение фотографии (думаю, замечали в новостной ленте). Возможно, тут стоит покопать - Не везде anti CSRF токены
Это действительно так. Но найденные мной места были некритичными.
- XSS
Разное
- Не удаляются файлы, даже после удаления
Многих пользователей так или иначе это заботит. Если прочитать статьи в начале, то можно узнать, что есть две версии по этому поводу — фрагментация данных на жестких дисках и проблема контроля целостности данных. Второй момент действительно сложен. Ту же картинку можно удалить, а она, возможно, где-то используется. Анализировать всю базу на пример использования документа весьма не просто. Но это ладно, хотлинки. А вот документы доступны только по обращению через скрипт, но и даже документы, после удаления, остаются доступными, хотя можно было бы добавить проверку. Ответ тех.саппорта был таким: «документ будет доступен по ссылке, даже если его удалить.» и всё. - по дефолту не включен https
Возвращаясь к письму Касперского — прямо сейчас советую принудительно поменять свои закладки с http на https, если этого еще не сделано. Сейчас mitm настолько прост, что хватит любого android-смартфона с рутом. Устанавливается droidsheep и нажав всего пару кнопок уже получится проснифать куки вк (и не только) и автоматически с ними зайти на сайт
Мусор
- Банально, но vk.com/config.php существует :) Вообще подобные вещи выносятся за htdocs
- vk.com/admin.html — CODE 200
- vk.com/test.html
- vk.com//login.html
- vk.com/test.php
- vk.com//index.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 — PHP EGGS
- vk.com/.DS_Store — WTF? Mac?
И «по-мелочам». Базу начинают чистить. Например лимит сообщений с юзером в переписке большой, но уже подчищается. Различные другие наработки оставил мусором в блокноте.
Возможно, где-то я ошибся в представлении о работе ресурса и у вас есть более четкие представления о каких-то выше описанных моментах или что-то изучали сами — буду рад услышать и обсудить их в комментариях.
Автор: BeLove