| Сегодня Воскресенье 22.12.2024

Нетривиальный синтаксис или JavaScript для хакеров


Каждая из описанных техник рассказывает, как при помощи XSS (Cross Site Scripting) можно изменить поведение скриптов, которые не подозревали о подобных возможных действиях со стороны данных, доступных для ввода самим пользователем на сайте. Обладая знаниями о подобном поведении JS можно значительно улучшить понимание языка и безопасность веб-приложений при их разработке. Итак, начнём.

Регулярные выражения в JavaScript могут выполнять код

Используя регулярные выражения (RegExp) в функции «replace», её второй аргумент может принимать не только строки, но и функции. Это означает, что вы можете использовать этот аргумент для выполнения кода. Для примера, проверьте кусок кода, приведенный ниже:
'XSS'.replace(/XSS/g,alert)
Этот код вернет выполнение строки alert('XSS'). Он работает потому, что совпадение в регулярном выражении пропускает функцию «alert» в качестве аргумента. Для того, чтобы использовать в качестве аргумента любую функция и код Javascript, достаточно создать новую функцию, первым аргументом в которую мы будем передавать найденный текст в регулярном выражении. Чтобы лучше понять, взгляните на пример:
'SomeHackString'.replace(/some/i,function($1){ /* $1 == 'Some' */ })
Но как вы увидели в первом примере, вместо вызова определенной функции, вызывался «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)» полностью:
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;
И на последок, привожу ссылку на полезный инструмент для составления закодированных строк: HackVertor Статья была основана на http://dev.opera.com/articles/view/opera-javascript-for-hackers-1/ с некоторыми личными дополнениями и заметками.
Категория: Разное | Добавил: Admin (10.10.2010)
Просмотров: 5240 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]