![]() |
Csrf-уязвимости при загрузке удалённых файлов на сервер.
В данной статье я хочу поговорить о CSRF-уязвимостях которые могут быть обнаружены в
различных движках при загрузке файлов на сервер не с компьютера пользователя а со стороннего сайта. Подобных уязвимостей было найдено довольно много в очень популярных скриптах, таких как WordPress и phpBB, но до сих пор к ним относятся как к чему-то бесполезному. Но во многих движках имеются условия при которых можно пойти намного дальше. Разберём всё на примере аватаров. На многих движках/сайтах/форумах пользователи могут загружать свои аватары не только из галереи или своего ПК но и со сторонних сайтов. Для этого нужно лишь указать адрес нужной картинки. При указании аватара как URL на стороннем сайте может произойти 2 вещи: 1. В поле аватара запишется что то типа <img src='указанный_путь'>. 2. Сервер пройдёт по указанному URL и загрузит нужное изображение, сохранив его у себя. Рассмотрим несколько вариаций атак которые можно произвести с помощью таких функций. DOS-атака на сторонний сайт. При обоих вариантах, если отсутствует должная фильтрация передаваемых пользователями URL, злоумышленник может вызывать произвольные GET-запросы на сторонние сайты. С помощью этого он может использовать уязвимый сайт как площадку для DOS-атак на какой-либо сервер страдающий SQL-injection вызываемой GET-методом(DOS через BENCHMARK). В первом случае как атакующие будут выступать пользователи просмотревшие страничку с этим аватаром, во втором — сервер, ведь он будет вызывать необходимые действия при попытке загрузки картинки с указанного URL. Естественно вариант со вписыванием URL в тег <img> намного продуктивнее. Самое интересное здесь то что и в первом и во втором случаях на атакованном сервере будет записан IP не взломщика а либо пользователей, либо сервера. DDOS Self Такой вариант атак возможен только если скрипт загрузки файлов не проверяет их размер. Даже если скрипт после загрузки обнаружит что это не изображение и удалит файл то атака всё равно состоится. Суть здесь в том что бы заставить сервер загрузить к себе файл огромных размеров. Этот файл может быть чем угодно, главное что бы он занимал как можно больше места — хоть 1 Тб (хотя чаше всего достаточно лимита памяти выделяемого для PHP, это ~25-30мб). Для генерации таких файлов не нужно ничего выдумывать или копипастом выстраивать их в блокноте =) Можно просто использовать следующий скрипт на PHP: Код:
<?phpвашего, то можете запрашивать не уже готовый файл а вызвать запрос к скрипту который будет бесконечно генерировать эти символы. Таким образом вы сразу убьёте двух зайцев — в пакете ответа от сервера не будет содержаться размер файла и для генерации даже гигабайтных файлов можно будет использовать не очень мощный компьютер потому что соединение будет держаться пока либо не оборвётся из-за проблем со связью, либо пока файл не сгенерируется до конца. Вот пример такого скрипта: Код:
<?phpпроверит из его результата тип получаемого файла. Хотя такие проверки я не встречал ни разу. Больший эффект может доставить несколько сотен таких запросов на получение файлов гигантского или бесконечного (за место for(...) - while(true) что бы файл генерировался без конца) объёма — это очень сильно забьёт канал, но это уже из раздела мистики =). Proxy Emitation Данный вариант атак возможен если сервер не проверяет тип загруженного файла или проверяет но всё равно оставляет загруженную информацию у себя. При таких атаках нападающий заставляет сервер загрузить содержимое произвольного URL к себе, а потом просто обращается к сохранённому документу получая таким образом результат совершённого сервером GET-запроса. Для лучшего понимания рассмотрим подобную уязвимость в Open SLAED 1.0. Я установил его на хост «slaed» в денвере. Вам желательно установить его на тот же хост, дабы избежать путаницы. Зарегистрируем нового пользователя и пройдём в редактирование профиля. В разделе «Настройки аватара», в поле «Загрузить аватар по ссылке» укажем любой хост (например http://localhost/index.php) и в конце URL сделаем следующую приписку: #image.jpg. Это нужно для обхода фильтрации по расширению. Теперь жмите на «сохранить изменения» и пройдите в папку [директория_slaed]/uploads/avatars/. Здесь лежат аватары загруженные пользователям. В этой директории должен появиться новый файл с произвольно генерированным именем типа «5-15waSfiKQ3.jpg». Если Вы откроете его в текстовом редакторе то обнаружите внутри html-код страницы которую Вы указали как аватар. Получается что сервер уже можно использовать как прокси для GET-запросов. Вот и сама суть «Proxy Emitation». Естественно нам здесь не обойтись без эксплойта т.к. в ручную проделывать подобные операции не очень хочется. Для начала подумаем что же наш эксплоит должен делать: 1. Авторизироваться на сайте. 2. Обновлять профиль. 3. Читать содержимое получившегося файла. Всё это писать лучше на PHP и в браузерном варианте потому что полученный html-код нужно будет отобразить =). Для работы с http мы будем использовать сокеты. Сейчас мы поэтапно реализуем нашу идею. Начнём с авторизации. Для начала нам нужно определить несколько обязательных переменных. А именно: 1. Хост с установленным slaed 2. Порт 3. Директорию 4. Нужный нам URL на который нужно будет отправить запрос 5. Логин пользователя и пароль У меня для этих переменных определены следующие значения: Код:
$host = "slaed";передать 2 параметра — user_name и user_password POST-методом. В коде это будет выглядеть так: Код:
$in = ""; # Текст запросанам нужно от него — cookies. Для этого можно использовать обычное регулярное выражение: Код:
$matches = Array();$matches[2][0] — идентификатор. В $matches[1][1] — имя куков пользовательской информации, ну и в $matches[2]1] — логин, пароль и id пользователя в base64. Эту информацию мы в итоге объединяем в переменной $cookies и у нас получается готовая строка куков. Теперь мы сможем включать её в любой запрос и всегда будем авторизированы. Следующим шагом нам нужно послать запрос на изменение аватара, указав как URL для загрузки нужный нам источник: Код:
# Обновляем профильфайле с расширением «.png». Теперь нам нужно лишь получить имя изображения. Для этого мы просто обратимся к странице редактирования профиля и с помощью регулярного выражения выдернем из неё то что нам нужно: Код:
// Смотрим профиль, получаем имя аватараКод:
// Загружаем запрошенный контентhttp://white-team.net/images/to_stat.jpg Не идеал конечно, но мы выполнили то что хотели — получили со стороннего сервера информацию при этом не оставив там свой IP. Если потратить побольше времени то можно дописать эксплоит так что бы он изменял все пути изображений/css-файлов на себя и грузил их, не превращая при этом вид страницы в то что указано выше на скриншоте. Автор: Kuzya. (с) White-Team(http://white-team.net), 2008. |
Цитата:
|
Цитата:
а вот насчет прокси ... можно таким образом скомпрометировать сервер. или я ошибаюсь ? |
Цитата:
Цитата:
несколько похожий концепт имхо http://xss-proxy.sourceforge.net/ |
Вы правы. Врят-ли кто-то будет применять такое широко на практике. Подобные атаки используются очень редко, и то для точечных нападений. Просто исследовательский интерес.
|
Цитата:
Концепт может и похожий... а вот реализация совершенно другая. |
По моему в статье не написано главного - о возможности выполнения ф-ций, доступных привилигерованным пользоватеям. Главное условие - чтобы эти ф-ции в движке вызывалась гет-запросом.
Допустим читает модератор чужую тему, и внизу есть ссылочка "стереть тему" http://forum.com/index.php?post=423434&delete, переходя по ссыле тема сразу стирается. И все, делаем аватар который ссылается на эту ссылу, когда модер прочтет ваш пост с этим аватаром, его браузер автоматически пройдет по ссыле... Правда ситуация вымышленная, и наверно движков где серьезные ф-ции выполняются одним гет-запросом раз-два и опчелся... |
Есть такое. Описано в другой моей статье. Такая бага была обнаружена например в Slaed
|
Цитата:
|
Кузе, как всегда, зач0т всесторонний :)
он написал книжку, в которой собрал кучу простых и понятных вещей, которые реально пригождаются |
| Время: 21:32 |