Межсайтовые атаки портов - XSPA – Часть 1

Межсайтовые атаки портов - XSPA – Часть 1

Многие веб-приложения позволяют вытягивать данные с других веб-серверов для различных целей. Этим функционалом можно злоупотреблять с помощью специально сформированных запросов.

Автор: Riyaz Ahemed Walikar

Это первый из трех постов, посвященных подробному описанию межсайтовых атак портов (XSPA). Я выступал с докладом по данной теме на недавно завершившейся конференции OWASP AppSecUSA2012 в Остине. Настало время занести эту информацию и в блог.

Пожалуйста, имейте в виду, что это независимое исследование, проведенное мной в ходе участия в нескольких программах поиска багов за вознаграждение. Хотя оно близко к исследованию Александра Полякова, посвященному SSRF, схожесть результатов является простым совпадением и показывает, насколько распространенными являются атаки XSPA/SSRF на популярные веб-приложения.

Обзор

Многие веб-приложения позволяют вытягивать данные с других веб-серверов для различных целей. Пользователь может задать веб-приложению URL, по которому оно будет скачивать изображения, загружать с удаленных серверов XML-ленты, текстовые файлы и т. д. Этим функционалом можно злоупотреблять с помощью специально сформированных запросов, используя уязвимые веб-приложения как прокси для атаки других сервисов, запущенных на удаленных/локальных (по отношению к веб-приложению) серверах. Атаки, злоупотребляющие данным функционалом, называются межсайтовыми атаками портов (XSPA).

Что такое XSPA?

Приложение уязвимо к XSPA, если при обработке введенного пользователем URL оно не проверяет/очищает ответ бэкенда, полученный от удаленных сереверов, перед тем, как вернуть его клиенту. Атакующий может посылать уязвимому веб-приложению специально сформированные запросы, чтобы проксировать атаки на внешние сервера, имеющие выход в Интернет, интранет-устройства или веб-сервер самого приложения, пользуясь функционалом уязвимого веб-приложения. В некоторых случаях из ответов веб-приложения можно извлечь информацию о доступности тех или иных служб (статус порта, баннеры и т. д.) и даже получить с удаленных серверов данные нестандартным способом.

На данном снимке экрана показан сайт gravatar.com, предоставляющий описанный выше функционал:

XSPA позволяет атакующим злоупотреблять имеющимся в большинстве веб-приложений функционалом для сканирования портов серверов интранет и внешних серверов с выходом в Интернет, получать информацию о типах и версиях (fingerprint) внутренних (без выхода в Интернет) сетевых сервисов, получать баннеры служб, определять фреймворк веб-приложения, эксплуатировать уязвимости в программах, запускать код на достижимых машинах, экспулатировать уязвимости веб-приложений во внутренних сетях, считывать локальные файлы и многое другое. XSPA были обнаружены на Facebook: сайт позволял сканировать порты любого сервера с выходом в Интернет, используя IP-адрес Facebook. Затем XSPA были обнаружены в нескольких других известных веб-приложениях, включая Google, Apigee, StatMyWeb, Mozilla.org, Face.com, Pinterest, Yahoo, Adobe Omniture и несколько других. Мы рассмотрим уязвимости, которые присутствуют в выше упомянутых веб-приложениях и которые можно использовать для запуска атак и сканирования портов на удаленных серверах и устройствах интранет с помощью имеющегося функционала.

Примеры реализации

Давайте рассмотрим несколько примеров PHP-реализаций выборки файлов по заданному пользователем URL. Вообще, XSPA затрагивает любое веб-приложение, если оно позволяет пользователю определять, откуда будут выбраны данные, независимо от того, на каком языке это приложение написано. Пожалуйста, имейте в виду, что показанные ниже примеры не являются ни хорошо написанными, ни безопасными, однако, большая часть представленного ниже кода была получена из реальных приложений.

1. PHP file_get_contents:

<?php
if (isset($_POST['url']))
{
$content = file_get_contents($_POST['url']);
$filename = './images/'.rand().'img1.jpg';
file_put_contents($filename, $content);
echo $_POST['url']."";
$img = "<img src=\"".$filename."\"/>";
}
echo $img;
?>

Данная реализация выбирает запрошенные пользователем данные (в данном случае – изображение), используя PHP-функцию file_get_contents, и сохраняет их на диске в файл со случайным именем. Затем изображение показывается пользователю в HTML-теге img.

2. PHP fsockopen() function:

<?php
function GetFile($host,$port,$link)
{
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno) \n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>

Эта реализация выбирает данные, запрошенные пользователем (произвольный файл или HTML), с помощью PHP-функции fsockopen. Данная функция устанавливает TCP-соединение с сокетом сервера и выполняет передачу сырых данных.

3. PHP curl_exec() function:

<?php
if (isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($curlobj);
curl_close($curlobj);

$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
?>

Это еще одна очень распространенная PHP-реализация, которая выбирает данные через cURL. Файл или данные загружаются и хранятся на диске внутри папки 'curled' в файле со случайным именем и с расширением txt.

В следующем посте мы увидим некоторые атаки, которые могут запускаться через данную уязвимость. XSPA позволяет атакующим нацеливаться на серверную инфраструктуру, главным образом на веб-сервера интранет, веб-сервер самого приложения, а также любой публично доступный сервер с выходом в Интернет. Я сталкивался с пятью различными атаками, которые могут запускаться через XSPA:

  1. Сканирование портов удаленных серверов с выходом в Интернет, устройств интранет и локального веб-сервера. В некоторых случаях также возможно получить баннеры служб.
  2. Эксплуатирование уязвимых программ, запущенных в интранет или на локальном веб-сервере
  3. Атака внешних/внутренних веб-приложений, которые имеют уязвимости в обработке GET-параметров запроса (SQL-инъекции через URL, манипуляция параметрами и т д.)
  4. Опознание типов и версий веб-приложений интранет с помощью стандартных файлов приложения и его поведения
  5. Чтение файлов локльного веб-сервера с помощью обработчика протокола file:///

Далее мы увидим примеры каждого из этих сценариев для нескольких известных веб-приложений Интернет.

Устали от того, что Интернет знает о вас все?

Присоединяйтесь к нам и станьте невидимыми!