Чем опасны скрипты в браузере

Обновлено: 07.07.2024

Этичный хакинг и тестирование на проникновение, информационная безопасность

Обход защит на основе JavaScript

JavaScript один из популярнейших языков, используемых в работе сайтов. Благодаря такой популярности, можно найти самые разные примеры применения JavaScript. Из них самыми бессмысленными являются:

  • контроль доступа с помощью JavaScript
  • защита части или всего контента с помощью JavaScript
  • верификация данных методами JavaScript без перепроверки на стороне сервера

Создавая сайт, нужно исходить из того, что любые данные, пришедшие со стороны пользователя, являются ненадёжными и JavaScript не может что-либо гарантировать.

Для демонстрации уязвимости JavaScript мы будем обходить защиту в Damn Vulnerable Web Application (DVWA). Для установки DVWA себе на компьютер смотрите статьи:

1. Любая часть веб страницы и JavaScript может быть произвольно изменена пользователем

Итак, ставим в DVWA уровень безопасности low (делается во вкладке DVWA Security) и переходим на страницу «JavaScript Attacks» и видим там следующее:


В качестве задания нам нужно передать слово «success» через форму на сайте. Пробуем: вписываем «success» и отправляем. Получаем ошибку «Invalid token.»:


Открываем исходный код страницы. Если у вас с этим проблемы на целевом сайте в реальной ситуации, то смотрите «Обход запрета показа исходного HTML кода, обход социальных блокировщиков и других мер противодействия сбору информации о сайте». В любом случае настоятельно рекомендуется предварительно изучить «Статический анализ исходного кода веб-сайта в браузере».

Между тегами <script></script> там следующее:


Я могу понять только следующие строки:

В функции generate_token() в первой строке переменной phrase присваивается то значение, которое имеет поле с идентификатором (id) phrase в форме. Затем во второй строке рассматриваемой функции значение переменной phrase обрабатывается двумя функциями и их значение присваивается элементу token в форме.

За пределами функция имеется код вызова этой функции:

Получается, единственный способ справится с заданием — это изменить значение поля phrase с «ChangeMe» на «success» до открытия в веб браузере. Как это можно сделать?


Но я покажу вам совсем «детский» способ, который я использовал с первых лет появления у меня компьютера, для этого способа вообще не нужны никакие инструменты.

Суть элементарна: сохраняем страницу себе на компьютер, открываем редактором (любым текстовым или для HTML кода), делаем нужные правки, открываем эту страницу в браузере и отправляем!

Сохраняем (имя я выбрал покороче, иначе из-за специальных символов могут быть проблемы):


Открываем файл *.html и находим форму:


Как вы можете увидеть — она изменилась, а именно присвоено значение полю token — видимо, это сделал браузер при сохранении:

Итак, во-первых, меняем «ChangeMe» на «success».

Иногда у страницы может быть уже установлен action, но адрес указан как относительный путь — в этом случае опять же отправка формы не будет работать как нам нужно. Для исправления просто укажите абсолютный путь до страницы на целевом сайте.

В-третьих, как я упомянул, при сохранении страницы браузер вписал значение token — уберём его (хотя, по логике, это необязательно, так как новое значение будет рассчитано и присвоено после открытия страницы).

Итак, у меня получилась следующая форма:

Сохраняю её и открываю файл в браузере:


Нажимаю кнопку «Submit»:


2. Изменение переменных JavaScript во время отладки

В веб-браузере откройте Инструменты разработчика (клавиша F12), перейдите во вкладку «Sources», выберите нужный файл (в нашем случае это (index)) и найдите в коде строку, где мы хотим сделать прерывание:


Кликните на номер строки для установки точки прерывания:


Обратите внимание, что в этой строке мы можем установить до четырёх прерываний, поскольку выполняется четыре операции. Я ставлю точку прерывания в самую правую часть — на первое действие:


Значение токена уже установлено, поэтому перезагрузим страницу, чтобы все скрипты выполнились заново.

Видим, что выполнение замерло на точке прерывания:


Присмотримся к этой информации:


Поменяем в этом окне значение phrase и нажмём кнопку «Resume script execution» (можно нажать F8):


На странице будут выполнены оставшиеся скрипты. Можно убрать точку прерывания и даже закрыть Инструменты разработчика.

Что мы имеем? Значение токена рассчитано для строки «success», теперь нам достаточно вписать эту строку в поле формы:



3. Отладка JavaScript во внешних файлах

В DVWA поднимите уровень безопасности до medium.

Между прочим, даже до вникания в особенности работы страницы, обратите внимание, что «детский» метод с сохранением страницы и изменением формы по-прежнему работает!

Но приступим к отладке, поскольку далеко не все случаи такие простые: например, форма отправки может вообще отсутствовать в исходном коде и создаваться на лету средствами JavaScript.

Посмотрим в исходный код страницы, JavaScript был вынесен в отдельный файл:

Содержимое этого файла такое:

Чтобы сделать код JavaScript читаемым обратитесь к статье «Деобфускация JavaScript кода». Я воспользуюсь инструментом JStillery.

Скачиваем интересующий файл:


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

Из трёх функций фактически используется только последняя, а остальные, видимо, добавлены чтобы нас запутать.

Начинаем отладку кода, чтобы заменить значение переменной для получения нужного нам токена.

В веб-браузере вновь переходим в Инструменты разработчика (F12), находим файл medium.js. Чтобы привести сжатый JavaScript в понятный вид нажмите кнопку :


Анализ кода подсказывает, что стоит обратить внимание на функцию:

Ставим точку прерывания там. Поскольку в одной строке выполняется сразу несколько операций, выбираем последнюю позицию для точки прерывания:



Видим, что переменной e присвоено значение «XX». Нажимаем F9 для перехода к следующему шагу.

Как видно, я был неправ говоря, что первые две функции добавлены только чтобы нас запутать — готовится вызов первой функции и в качестве параметра e ей будет передано «XXChangeMeXX». Видимо, это и есть начало вычисления токена.


Я присвоил параметру e значение «success», но получил ошибку о неверном токене. По аналогии с передаваемым значением («XXChangeMeXX»), назначем e строку «XXsuccessXX».


Затем нажимаем F8 для продолжения выполнения кода JavaScript без отладки и прерываний.

Вводим на странице слово «success»:



Как можно увидеть, всё прошло сработало.

4. Отладка обфусцированного кода JavaScript

В DVWA поднимите уровень безопасности до High.

JavaScript код вновь вынесен в файл high.js, посмотрим на него:


Код обфусцирован, я попробовал применить JStillery, но принципиально ничего не изменилось — код остался полностью нечитаем.

После деобфускации получился большой фрагмент JavaScript кода.


В конце кода есть следующие функции:

Обратите внимание на строку:

Выход из этой ситуации есть — причём функция изменения файлов на лету и сохранение этих изменений даже после перезагрузки страницы есть прямо в Инструментах разработчика браузера. Подробности смотрите в статье «Как сделать так, чтобы изменения в Инструментах разработчика браузера сохранялись после перезагрузки страницы».

Вставляем деобфусцированный код, ставим точку прерывания:


Добавляем эту страницу в «Save for overrides» как это описано в статье по ссылке выше и перезагружаем страницу.

Пожалуй, не буду разбирать этот пример до конца — будет это будет домашним заданием.

Заключение

На практике встречаются очень сложные для анализа варианты использования JavaScript, комбинирующие динамическое построение DOM структуры страницы, динамическое назначение событий, обфускацию кода, использование громоздких фреймворков и т. д. Но в целом исходить нужно из того, что защиты на стороне пользователя, в том числе с использованием JavaScript априори являются ненадёжными.

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

Вступление

Так всё же, что делают эти скрипты? Чаще всего вредоносные JScript файлы устанавливаются «хакерами», для получения какой либо выгоды, а именно:
Пополнение своего ботнета, установка винлокеров, исправления файла hosts для перенаправления пользователей на фейковые сайты, ну и конечно же для обмена трафиком.

Так вот, я попробую подробно рассказать о том, как раскодировать вредоносный JavaScript и в последствии вычислить адрес, куда он ведет.

Подготовка

Программное обеспечение

Пользоваться я буду редактором NetBeans IDE 7.0. Во-первых, я всегда в нем работаю, а во-вторых, в нем очень удобно форматировать код. Но Вы можете использовать наиболее удобный Вам редактор.

Ищем вредоносный код

Первые действия


После того, как мы отформатировали код, и внесли его в html документ между тегами у нас получилось примерно следующее (На скриншоте не весь код)

Кратко о выполняемых действий

Как мы видим, сейчас скрипт у нас не читаем. Для его раскодировки, нам понадобится сделать всего несколько действий. Сейчас кратко: Закомментируем eval (Функция которая выполняет весь код), потом создадим переменную x С той частью кода, которая выполняется в eval. Вызовем переменную x функцией document.write(x);. Последним действие уберем 16-ричную систему функцией unescape().
На теории всё легко, а на практике еще легче!

Переходим к главному — практика

Как я писал выше, мы будем работать с данной функцией (У меня она начинается на 24 строчке файла, у Вас может быть по другому):

И так приступим. У нас есть строчка $E['eva\x6C']($E[$d.$fJ]($j)); Которую мы должны закомментировать. Делается это двумя слешами // $E['eva\x6C']($E[$d.$fJ]($j));
Далее ниже определяем переменную, и вызываем её, и у нас получается следующее:


Теперь ничего опасного нам не грозит, можем выполнить файл в браузере:


Скопируем полученный код, и отформатируем его:

Завершение

Теперь нам придется достаточное время повозиться, убирая 16-ричную систему. Делается это так:

Создаем файл index2.html с содержимым

Берем первую строчку из нашего первого файла (index.html)


Вставляем часть строчки в файл index2.html, вызываем её алертом, и получится вот такой код:



Выполняем…

Копируем полученное, и заменяем это в первой строчке, и так проделываем со всеми строками, в которых есть 16-ричная система.

Результат

Заключение

Также хочу поделиться с вами статьёй, которую написал пользователь Raz0r. Она написана по мотивам моего топика, а именно небольшой обзор 5 бесплатных онлайн сервисов для анализа и борьбы с malware.

JavaScript - это одна из таких вещей, без которых уже довольно сложно представить современную Всемирную паутину. Благодаря JavaScript'у она впервые приобрела ту заманчивую интерактивность, которую потом развили такие технологии, как Flash и AJAX. Однако, как то ни удивительно, название такой широко используемой технологии зачастую вызывает недоумение у пользователей Всемирной паутины.

JavaScript - это специальный язык программирования, разработанный для использования в браузерах. Впервые он появился ещё в 1995 году в браузере Netscape Navigator и с тех пор его поддержка является международным стандартом для всех приличных браузеров (кроме, разве что, пожалуй, мобильных). JavaScript используется для написания небольших программ - скриптов, которые могут реагировать определённым образом на действия пользователей, открывших ту или иную web-страницу. Хорошей иллюстрацией использования JavaScript будут выпадающие меню, которые используются для навигации на многих сайтах во Всемирной паутине.

На самом деле использование JavaScript может быть куда шире, чем только для web-страниц. С помощью этого языка программирования можно создавать скрипты, автоматизирующие какие-либо рутинные операции, которые можно не выполнять вручную, а переложить на плечи программы.

JavaScript несёт в себе не только пользу - потенциально он опасен, и сейчас его рекомендуется по умолчанию отключать в браузерах. Дело в том, что программу можно написать не только полезную, но и вредную (или, вернее сказать, вредоносную) - например, такую, которая будет воровать вводимые вами пароли или закачивать троян, который станет заниматься рассылкой спама. Именно из-за того, что в Интернете количество вредоносных программ превышает все мыслимые и немыслимые пределы, в настоящее время всем пользователям рекомендуется отключить JavaScript для всех сайтов, кроме тех, которые точно являются проверенными и не несут в себе никакой потенциальной угрозы.

Стоит отметить, что JavaScript является не единственным в своём роде языком программирования, применяемым для повышения интерактивности web-страниц. Internet Explorer поддерживает JScript, очень похожий на JavaScript, но всё-таки несколько отличный от него в некоторых деталях, а также совершенно отдельный язык VBScript. Однако, поскольку VBScript не поддерживается другими распространёнными браузерами, то и разработчики web-страниц используют его намного реже, чем JavaScript.

СпецНаз (специальные названия)

О вредоносных скриптах: как они работают, чем опасны и как не столкнуться с ними

18 января 2021

Сегодняшний выпуск посвящаем краткому экскурсу в мир вредоносных скриптов, разговору о том, как им противостоит Dr.Web, - и советам о том, как избежать встречи с ними.

Один из наших читателей в соцсетях задал вопрос о вредоносных скриптах и общей безопасности при работе в Интернете. В частности, он интересовался защитой от угроз на JavaScript и других скриптов, размещаемых злоумышленниками на веб-страницах, а также попросил дать несколько советов по правильной настройке веб-антивируса Dr.Web. Благодарим за актуальный вопрос – ведь это отличный повод разобраться, в чем же там дело!

Если рассказывать обо всех вредоносных скриптах, которые когда-либо видели специалисты нашей вирусной лаборатории, то статья по своему объему потянет на учебник и явно не впишется в формат «Антивирусной правды». Вы наверняка уже догадались, что это очень многообразный, а значит – распространенный тип вредоносных программ.

Что же такое вредоносный скрипт?

В широком смысле всякий скрипт – это программный код (сценарий), написанный на различных интерпретируемых языках. Все скрипты выполняются с помощью внешней программы – интерпретатора. В отличие от исполняемых файлов, скрипты в большинстве своем существуют в виде текстовых файлов и могут быть прочитаны человеком. Например, исходный код скомпилированного файла привести в первозданный вид почти невозможно, а скрипты, напротив, всегда содержат исходный код. По принципу работы «плохие» скрипты ничем не отличаются от «хороших».

Вредоносные скрипты можно условно разделить на два вида.

  1. Скрипты, которые встраиваются в код веб-страниц, интерпретируются браузером и выполняют действия, заложенные злоумышленниками.
  2. Скрипты, которые предназначены для запуска на компьютере пользователя. Они исполняются компонентами операционной системы и имеют доступ к API (файловая система, процессы и т. д.).

В контексте работы в Интернете под вредоносными скриптами чаще всего подразумевается первый вид. Такие сценарии как правило написаны на JavaScript и PHP. Они находятся в коде страниц недобросовестных или взломанных сайтов и пытаются майнить криптовалюту в браузере пользователя, отображают рекламу с целью накруток, перенаправляют на другие сайты, зачастую мошеннические и опасные. К веб-скриптам можно отнести и PHP-инфекторы, которые заражают «хорошие» скрипты на серверной стороне. Кроме того, вредоносный код может находиться в составе расширений для браузеров.

Теоретически скрипт веб-страницы может быть использован как эксплойт – набор ошибочно интерпретируемых браузером данных, позволяющий получить доступ к атакуемой системе. Однако в настоящее время такие эксплойты встречаются все реже в виду развития браузеров, которые ограничивают доступ к функциям ОС, поэтому вредоносный код на сайте едва ли может навредить компьютеру в целом. Но несмотря на это, упомянутых деструктивных функций вполне достаточно, чтобы сильно испортить жизнь любому пользователю. Реклама, мошенничество, фишинг, замедление работы браузера, даже сам взлом сайтов – это все про веб-скрипты. К тому же они кроссплатформенны и очень распространены, поскольку злоумышленники массово используют их для инфицирования страниц и веб-серверов.

Но опасность подстерегает не только на сайтах. Другим видом вредоносных скриптов являются сценарии, которые запускаются компонентами ОС. Они могут быть написаны на разных скриптовых языках: JScript, VBS, PowerShell, Perl, Python и многих других. Такие сценарии гораздо более функциональны и опасны, так как обращаются напрямую к API-объектам. Несмотря на то, что скрипты крайне редко содержат основную функциональность, они часто используются либо для начальной загрузки других вредоносных модулей в заражаемые системы, либо для промежуточных действий или вспомогательных операций. Например, в Windows часто встречаются PowerShell-скрипты, содержащие эксплойты или утилиты для продвижения по системе/сети. Хотя скрипты и считаются кроссплатформенным инструментом, некоторые из них работают только в предназначенных для этого ОС, так как для их работы важно наличие тех или иных системных API. Упомянутые PowerShell, а также BAT и JScript-сценарии работают в Windows, AppleScript предназначен для macOS, а ВПО для Linux часто представлено в виде bash-скриптов.

Системные скрипты для ОС чаще всего распространяются через электронную почту, раздаются на взломанных и вредоносных сайтах, загружаются другими программами, распространяются самостоятельно через съемные носители и сетевые ресурсы.

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

Для обезвреживания системных скриптов в Windows мы применяем алгоритмы машинного обучения, встроенные в основное антивирусное ядро. Такой подход позволяет успешно детектировать вредоносный код вне зависимости от его запутанности, что невозможно было бы сделать при помощи сигнатурного анализа.

Для блокировки веб-скриптов используется наш эвристический анализатор и веб-антивирус – SpIDer Gate. Отметим, что для эффективной защиты дополнительно настраивать какой-либо из компонентов Dr.Web не нужно, так как настройки по умолчанию соответствуют оптимальным.

Таким образом, сегодня мы узнали, что скрипты могут нести самую разную вредоносную нагрузку – являться эксплойтами, майнерами, различными вспомогательными утилитами, рекламными троянами и даже шифровальщиками. Чтобы обезопасить себя и свой компьютер, требуется использовать надежную защиту.

Читайте также: