JSFuck - JSFuck

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

История

В июле 2009 года Йосуке Хасегава создал веб-приложение под названием jjencode который может кодировать произвольный JavaScript в обфусцированную форму, используя только 18 символов []()!+,\"$.:;_{}~=.[2][3] В январе 2010 года на форуме "Обфускация" сайта безопасности веб-приложений sla.ckers.org был проведен неформальный конкурс, чтобы найти способ сократить минимальное количество символов до менее восьми: []()!+,/. Авторам темы удалось устранить необходимость в , и / символы.[4] По состоянию на март 2010 года был доступен онлайн-кодировщик под названием JS-NoAlnum, который использовал только последний набор из шести символов.[5] К концу 2010 года Hasegawa выпустила новый кодировщик под названием JSF * ck, который также использовал только минимум шесть символов.[6][7] В 2012 году Мартин Клеппе создал проект "jsfuck" на GitHub,[8] и веб-сайт JSFuck.com с веб-приложением, использующим эту реализацию кодировщика.[9]

JSFuck можно использовать для обхода обнаружения вредоносный код представлены на веб-сайты, например в межсайтовый скриптинг (XSS) атаки.[10] Еще одно возможное использование JSFuck заключается в обфускация кода. Оптимизированная версия JSFuck использовалась для кодирования jQuery, а Библиотека JavaScript, в полнофункциональную версию, состоящую всего из шести символов.[11]

Методы кодирования

Код JSFuck чрезвычайно многословен: в JavaScript код тревога("Привет, мир! "), что вызывает неожиданно возникнуть окно, которое открывается с текстом «Hello world», имеет длину 21 символ. В JSFuck тот же код имеет длину 22948 символов. Некоторым одиночным символам требуется намного больше 1000 символов при раскрытии как JSFuck. В этом разделе представлен обзор того, как работает это расширение.

Числа

Число 0 создано +[], куда [] это пустой множество и + это унарный плюс, привыкший конвертировать справа от числового значения (здесь ноль). Число 1 формируется как +!![] или же +!+[], где логический ценить истинный (выражается как !![] или же !+[] в JSFuck) преобразуется в числовое значение 1 добавленным знаком плюс. Цифры от 2 до 9 образуются путем суммирования истинный соответствующее количество раз. Например. в JavaScript правда + правда = 2 и истинный = !![] = !+[], следовательно, 2 можно записать как !![]+!![] или же !+[]+!+[]. Остальные цифры следуют аналогичному шаблону. Целые числа, состоящие из двух или более цифр, записываются в виде строки сцепление Однозначные массивы с оператором плюс. Например, строка "10" может быть выражено в JavaScript как [1] + [0]. Заменяя цифры соответствующими расширениями JSFuck, это дает [+!+[]]+[+[]].Чтобы получить числовое значение вместо строки, нужно заключить предыдущее выражение в круглые или квадратные скобки и поставить перед плюсом, получив 10 = +([+!+[]]+[+[]]).

Буквы

Некоторые буквы могут быть получены в JSFuck путем доступа к отдельным символам в строковых представлениях простых логических или числовых значений, таких как "ложный", "истинный", "NaN", "неопределенный" с индексатор (число в квадратных скобках). Чтобы получить другие буквы, нужны и другие уловки - например, приведение строки 1e1000 в число, что дает бесконечность, что, в свою очередь, делает букву у доступный.[12]

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

ЦенитьJSFuck
ложный![]
истинный!![] или же !+[]
NaN+[![]]
неопределенный[][[]]
бесконечность+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])

Пример: создание буквы "а"

"а": Взято из строки "ложный". Второй символ "false" - это a, к которому можно получить доступ:

  1. "ложь" [1]. "ложный" можно сделать из ложь + [], т.е. логическая константа false плюс пустой массив.
  2. (ложь + []) [1]: Мы пишем false как ![] (отрицание применяется к пустому массиву).
  3. (![]+[])[1]: 1 - это число, мы можем записать его как + правда.
  4. (! [] + []) [+ верно]: Поскольку false ![], правда !![].
  5. (![]+[])[+!![]] - который оценивается как «а».

Доказательство: в JavaScript предупреждение ((! [] + []) [+ !! []]) делает то же самое, что и предупреждение ("а").[13]

Другие конструкции

В Функция конструктор может использоваться для запуска выполнения кода JavaScript, содержащегося в строке, как если бы это был собственный JavaScript. Так, например, утверждение оповещение (1) эквивалентно Функция ("alert (1)") (). В Функция конструктор можно получить в JSFuck, обратившись к конструктор свойство хорошо известной функции, например []["фильтр"] (Array.prototype.filter). А потом оповещение (1) становится [] ["фильтр"] ["конструктор"] ("предупреждение (1)") ().

Таблица символов

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

ХарактерJSFuck
+(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[!+[]+!+[]]
.(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]
0+[]
1+!![]
или же +!+[]
2!![]+!![]
или же !+[]+!+[]
3!![]+!![]+!![]
или же !+[]+!+[]+!+[]
4!![]+!![]+!![]+!![]
или же !+[]+!+[]+!+[]+!+[]
5!![]+!![]+!![]+!![]+!![]
или же !+[]+!+[]+!+[]+!+[]+!+[]
6!![]+!![]+!![]+!![]+!![]+!![]
или же !+[]+!+[]+!+[]+!+[]+!+[]+!+[]
7!![]+!![]+!![]+!![]+!![]+!![]+!![]
или же !+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
8!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]
или же !+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
9!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]
или же !+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
а(![]+[])[+!+[]]
d([][[]]+[])[!+[]+!+[]]
е(!![]+[])[!+[]+!+[]+!+[]]
ж(![]+[])[+[]]
я([![]]+[][[]])[+!+[]+[+[]]]
я(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))+[])[+[]]
л(![]+[])[!+[]+!+[]]
N(+[![]]+[])[+[]]
п([][[]]+[])[+!+[]]
р(!+[]+[])[+!+[]]
s(![]+[])[!+[]+!+[]+!+[]]
т(!+[]+[])[+[]]
ты([][[]]+[])[+[]]
у(+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))])[+!+[]+[+[]]]

Безопасность

Не обладая отличительными особенностями «обычного» JavaScript, методы обфускации, такие как JSFuck, могут помочь вредоносному коду JavaScript обойти системы предотвращения вторжений.[14] или фильтры содержимого. Например, отсутствие буквенно-цифровых символов в JSFuck, с одной стороны, и некорректный фильтр содержимого, с другой стороны, позволяли продавцам встраивать произвольные сценарии JSFuck на свои страницы аукционов eBay.[15]

Рекомендации

  1. ^ Джейн Бейли /Ежедневный WTF: "Торги по ценным бумагам". http://thedailywtf.com/articles/bidding-on-security
  2. ^ Хасэгава, Ёске (10.07.2009). «jjencode - кодируйте любую программу JavaScript, используя только символы». utf-8.jp. В архиве из оригинала от 15.07.2009. Получено 2017-10-25.
  3. ^ Хасэгава, Ёске (июль 2009 г.). "UTF-8.jp [2009-07-28]". utf-8.jp. В архиве из оригинала от 28.07.2009. Получено 2017-10-25.
  4. ^ «Еще один бесполезный конкурс (но весело!) Меньше символов требуется для запуска произвольного JS-кода». sla.ckers.org. 2010-01-14. Архивировано из оригинал на 2011-03-01. Получено 2017-10-25.
  5. ^ "js-noalnum_com.php". discogscounter.getfreehosting.co.uk. В архиве из оригинала от 01.03.2010. Получено 2017-10-25.
  6. ^ Айко, Кендзи (ноябрь 2010 г.). "JSF * ck - [] ()! +". utf-8.jp. Архивировано из оригинал на 2010-12-01. Получено 2017-10-25.
  7. ^ Хасэгава, Ёске (ноябрь 2010 г.). "UTF-8.jp [2010-11-30]". utf-8.jp. В архиве из оригинала 30.11.2010. Получено 2017-10-25.
  8. ^ Клеппе, Мартин (2012-07-16). "Совершает · aemkei / jsfuck". github.com. Получено 2017-10-25.
  9. ^ Клеппе, Мартин (сентябрь 2012 г.). "Отчет по сайту для www.jsfuck.com". toolbar.netcraft.com. Получено 2017-10-25.
  10. ^ https://arstechnica.com/security/2016/02/ebay-has-no-plans-to-fix-severe-bug-that-allows-malware-distribution/ Ars Technica: Ebay не планирует исправлять серьезную ошибку, которая позволяет распространять вредоносное ПО
  11. ^ https://github.com/fasttime/jquery-screwed Библиотека jQuery JavaScript состоит всего из шести разных символов:! () + []
  12. ^ http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html "Brainfuck Beware: JavaScript преследует вас!"
  13. ^ Адаптирован из: https://esolangs.org/wiki/JSFuck
  14. ^ Ре Медина, Матиас А. (2012-09). Обход WAF с помощью не буквенно-цифрового XSS. Извлекаются из http://blog.infobytesec.com/2012/09/bypassing-wafs-with-non-alphanumeric-xss.html.
  15. ^ Дэн Гудин (3 февраля 2016 г.). «eBay не планирует исправлять« серьезную »ошибку, которая позволяет распространять вредоносное ПО [Обновлено]». Ars Technica.

внешняя ссылка