Нетривиальный синтаксис или JavaScript для хакеров
Каждая из описанных техник рассказывает, как при помощи XSS (Cross Site
Scripting) можно изменить поведение скриптов, которые не подозревали о подобных
возможных действиях со стороны данных, доступных для ввода самим пользователем
на сайте. Обладая знаниями о подобном поведении JS можно значительно улучшить
понимание языка и безопасность веб-приложений при их разработке. Итак, начнём.
Регулярные выражения в JavaScript могут выполнять код
Используя
регулярные выражения (RegExp) в функции «replace», её второй аргумент может
принимать не только строки, но и функции. Это означает, что вы можете
использовать этот аргумент для выполнения кода. Для примера, проверьте кусок
кода, приведенный ниже:
'XSS'.replace(/XSS/g,alert)
Этот код вернет выполнение
строки alert('XSS'). Он работает потому, что совпадение в регулярном выражении
пропускает функцию «alert» в качестве аргумента. Для того, чтобы использовать в
качестве аргумента любую функция и код Javascript, достаточно создать новую
функцию, первым аргументом в которую мы будем передавать найденный текст в
регулярном выражении. Чтобы лучше понять, взгляните на пример:
Но
как вы увидели в первом примере, вместо вызова определенной функции, вызывался
«alert», в который аргумент передавался от вызова функции регулярного выражения
(т.е 'XSS'). Этот интересный трюк может быть использован для обхода XSS
фильтров, для примера, вы можете ввести любую строку, содержащую валидный JS-код
и затем её автоматически выполнить.Для того, чтобы увидеть, как это может быть
использовано в контексте XSS, представим что символ двойной кавычки (") не
фильтруется в введенной пользователем строке. Далее, первым делом мы пишем
необходимый код, который нужно выполнить, например alert(1), затем вводим
двойную кавычку, чтобы сформировать в итоге строку, и дальше завершаем «буклет»
при помощи регулярного выражения и функции eval, которая будет передана в
качестве второго аргумента:
.replace(/.+/,eval)//
Например, на потенициально «дырявой»
странице, существует следующий исходный код:
<script>someVariableUnfiltered = "USER INPUT HERE"</script>. Этот
код может встречаться на форумах, при вставке аналитических скриптов, рекламных
блоков и др. Так вот, когда строка "USER INPUT HERE" формируется со стороны
введенных данных пользователем, то при условии недостаточно фильтрования
введенных символов, это может привести к внедрению на страницу произвольно
выполняемого JS-кода. В итоге это будет выглядеть так:
<script>someVariableUnfiltered="alert(1)".replace(/.+/,eval)//"</script>.
Два слэша на конце строки необходимы для того, чтобы оставшаяся часть строки
была обработана как комментарий и не помешала выполнению XSS-инжекции (т.к в
конце остается закрывающая кавычка).
Выполнение JavaScript в Unicode
В случае, если необходимые символы
экранируются или заменяются фильтром, при вводе текста, можно воспользоваться
записью имени функции в Unicode, и она будет обработана и выполнена в
Javascript! Пример:
\u0061\u006c\u0065\u0072\u0074(1)
Этот код будет обработан
внутри JS как «alert(1)». \u означает что символ записан в формате юникода, а
числа — это запись символа в шестнадцатиричном формате (hex). Т.е запись вида
\u0061 означает символ «a», итд. Также, можно одновременно использовать
закодированные символы в юникоде с обычными, что также дает работающий код, как
в этом примере: \u0061lert(1). Примечание: чтобы получить необходимое
шестнадцатиричное значение любого символа при помощи JS, можно воспользоваться
функциями charAt и toString: 'a'.charCodeAt(0).toString(16) // charCodeAt(0)
вернет нам 97 (но это значение ASCII-символа в десятичной системе счисления),
toString(16) сконвертит его в HEX. Выражения JS, закодированные при помощи
юникода могут быть использованы в качестве имен переменных, функций, объектов,
итд. Например такая строка будет корректно выполнена: \u0061 = 123; alert(a) //
вернет "123", а выполнение кода eval('\\u'+'0061'+'lert(1)') соответственно
выдаст нам alert(1). В остальных случаях поэкспериментируйте с юникодом сами.
JavaScript выполняет закодированную строку в адресах
Часто на многих
сайтах, где подразумевается создание пользовательского аккаунта, есть профайл,
который можно заполнять информацией. В случае если скрипт подразумевает наличие
адресов (ссылок), например на сайты, то при недостаточной проверке и сохранении
данных, введенных от пользователя, можно внутрь ссылки внедрить JS-код. Самый
простой пример, без кодирования какого-либо набора JS-символов, будет выглядеть
так: «javascript:alert(1)», т.е это и будет адресом ссылки, внутри параметра
«href». При клике по ссылке выполниться код alert(1). Эту же строку можно
закодировать при помощи функции «escape», после чего она примет вид:
«javascript%3Aalert%281%29» и также прекрасно будет себя чувствовать при клике
по ссылке. Точно также можно закодировать строку в юникод, как описывалось выше,
код будет отработан валидно. Еще одна забавная особенность яваскрипта, если
закодировать все символы в HTML-сущности, т.е
«&#Тут_числовое_значение_ASCII_символа;», то такая строка внутри адреса
будет интерпретирована как обычный текст, и в итоге JS-код будет выполнен. Таким
образом, закодируем строку «javascript:alert(1)» полностью:
И
на последок, привожу ссылку на полезный инструмент для составления
закодированных строк: HackVertor Статья была основана на
http://dev.opera.com/articles/view/opera-javascript-for-hackers-1/
с некоторыми личными дополнениями и заметками.
Для комфортного отображения сайта: 1) Лучше пользоваться браузерами Opera 9+, Mozilla Firefox 3+ или Internet Explorer 8+. 2) Лучше монитор с разрешением не меньше 1024x768 (ширина x высота) пикселей. 3) Если пользоваться программой Adguard вы можете сэкономить на трафике и перестанете видеть не нужную рекламу ! Отличная программа для блокировки всякой рекламы на сайтах ! Ссылка на сайт программы Ссылка на установочный пакет программы