Обфускация и деобфускация JavaScript: основы и инструменты

В цифровом мире информационная безопасность обеспечивает непрерывную работу бизнеса и защиту конфиденциальности пользователей. Но несмотря на меры защиты, веб‑приложения — важные мишени для злоумышленников, которые постоянно ищут уязвимости. Один из методов защиты веб‑приложений от атак — обфускация JavaScript.

Что такое обфускация

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

Средства обфускации могут преобразовать код так, чтобы он стал похож на большой словарь слов и символов. При выполнении кода обфускатор пытается собрать его обратно, используя этот словарь. Каждое слово или символ заменяются ссылкой на их место в словаре. Ниже приведен пример для простого JavaScript кода. Слева — исходный код, справа — обфусцированный.

83eb170bc0ef2c733c126cb8e5af58ae.png

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

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

В качестве примера рассмотрим код на JavaScript:

function hi() {

    alert("Hello Skillfactory!");

    } 

hi();

Это простая функция JavaScript, которая выводит сообщение «Hello Skillfactory!». Вы можете протестировать ее в своем браузере. Например, в Firefox нужно открыть консоль разработчика клавишей F12 и перейти во вкладку «Консоль». Далее — вставить ранее упомянутый код:

a7c49fcbb5dc3e8cc8e6b5a088349255.png

Функция успешно отработала и вывела в консоль сообщение «Hello Skillfactory!».

Основные методы обфускации JavaScript

Минификация

Процесс удаления из исходного кода всех ненужных символов, таких как пробелы, переносы строк и комментарии. Это делает код более компактным и трудночитаемым для человека. Для тестирования можем использовать https://skalman.github.io/UglifyJS-online/.

735b90433454a50aa38ad1cbcdffc28e.png

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

a5755e6bafaa15597bca21686fe5d5e3.png

Packing JavaScript

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

В качестве примера онлайн-обфускатора можем обратиться к https://beautifytools.com/javascript-obfuscator.php. Воспользуемся JavaScript-кодом.

d2e8874bd9077f2c6e13c8161f217dec.png

Из простой функции мы получили:

eval (function (p, a, c, k, e, d){e=function©{return c}; if (!''.replace (/^/, String)){while (c--){d[c]=k[c]||c}k=[function (e){return d[e]}]; e=function (){return'\\w+'}; c=1}; while (c--){if (k[c]){p=p.replace (new RegExp ('\\b'+e©+'\\b','g'), k[c])}}return p}('1 0(){2(»3 4!»)}0();',5,5,'hi|function|alert|Hello|SkillFactory'.split ('|'),0,{}))

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

53e18d2bfced695c624afa21515c3f42.png

Пример пытается преобразовать все слова и символы кода в список или словарь, а затем сослаться на них с помощью (p, a, c, k, e, d) функции для воссоздания исходного кода во время выполнения. (p, a, c, k, e, d) может различаться в разных упаковщиках. Обычно он содержит определенный порядок, в котором были упакованы слова и символы исходного кода, чтобы знать, как расположить их во время выполнения.

Хотя пример отлично демонстрирует уменьшение «читаемости» кода, мы все равно можем видеть основные строки, написанные открытым текстом. Это может раскрыть некоторые функциональные возможности.

obfuscator.io

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

3f57666435002995652a7d0b6654f4ae.png

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

37657090b1f9697c52b43ed5dc36d89f.png

JSFuck

JSFuck — это, с одной стороны, один из самых экстремальных видов кодирования на JavaScript, но с другой — хороший способ обфусцировать код. Метод кодирования представляет собой исполнение JavaScript-кода с использованием только шести символов: [ ] () ! +. Другими словами, с помощью JSFuck можно написать JavaScript-код без букв или цифр.

Воспользуемся сайтом https://jsfuck.com, чтобы наглядно увидеть, что станет со строкой-примером.

d785c976caa109e78b073fcd90bb7c31.png

Простая команда превращается в [][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]. В данном случае ничего не понятно, но код выполняется в браузере.

Что такое деобфускация

Рассмотрим, как можно деобфусцировать JavaScript. Для деобфускации кода тоже есть инструменты.

JSFuck

Попробуем закодировать строку alert (1). В JSFuck она будет выглядеть следующим образом:

(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[+[]]])[!+[]+!+[]+[+[]]]

Чтобы деобфусцировать код, воспользуемся сайтом https://www.dcode.fr/jsfuck-language.

e0abbe1261bb8596abffb6b67b27889c.png

Удалось получить строку в исходном виде. Немного усложним пример. Возьмем предыдущий код JavaScript:

function hi() {

   alert("Hello SkillFactory!"); 

}

 hi();

Если после преобразования в JSFuck загрузим его на сайт с деобфускатором, то получим следующее:

58b5665be1e37124447eedec5e6bd0cd.png

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

de4js

Деобфусцировать JavaScript, который был преобразован с помощью инструментов из блока Packing JavaScript, может помочь инструмент de4js. Его можно установить локально на рабочую машину из репозитория https://github.com/lelinhtinh/de4js, но мы воспользуемся онлайн-инструментом по адресу https://lelinhtinh.github.io/de4js.

a40a363d97d8e3c19f16a20892834e7f.png

Выбрав кнопку «Eval», привели код к исходному виду. Можем нажать кнопку «Auto Decode», чтобы de4js автоматически определил способ обфускации. Деобфусцированный код будет показан в нижнем окне. 

Дополнительные опции, которые вы можете включить или выключить:  

  • Line numbers — показ номера строк;  

  • Format Code — форматирование и подсветка синтаксиса кода;

  • Unescape strings — перевод строк из экранированных последовательностей в нормальный вид;  

  • Recover object-path — восстановление object-path;  

  • Execute expression — вычисление выражения;  

  • Merge strings — объединение строки;  

  • Remove grouping — удаление группировки. 

JS Beautifier

Программа JS Beautifier улучшает внешний вид JavaScript-кода путем переформатирования и добавления отступов. Она способна распаковывать скрипты, упакованные популярным пэкером от Dean Edward, частично деобфусцировать скрипты, обработанные npm пакетом javascript-obfuscator. JS Beautifier применяется для повышения читаемости JavaScript кода. Онлайн-версия находится по адресу https://beautifier.io/.

Попробуем загрузить туда код, обфусцированный посредством минификации. В левом окне — исходный код, в правом — минифицированный.

a4e44cae8846ab33d2bf6ec640a0430b.png

Теперь загрузим минифицированный код в https://beautifier.io/.

be311a77943a75bdd987fedf437a909b.png

После нажатия кнопки «Beautify Code» получаем уже более «читабельный» вид.

61bab14c8ac7f75ebec0748a101cb746.png

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

Узнать больше о защите данных можно на онлайн-магистратуре »‎Информационная безопасность» от МИФИ и Skillfactory. 

© Habrahabr.ru