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 года Хасэгава представил новый кодировщик под названием JSF*ck, который также использовал только минимум шесть символов. [6] [7] проект «jsfuck» В 2012 году Мартин Клеппе создал на GitHub , [8] и веб-сайт JSFuck.com с веб-приложением, использующим эту реализацию кодировщика. [9]
JSFuck можно использовать для обхода обнаружения вредоносного кода, представленного на веб-сайтах , например, при атаках с использованием межсайтовых сценариев (XSS). [10] Другое потенциальное применение JSFuck заключается в обфускации кода . Оптимизированная версия JSFuck использовалась для кодирования jQuery , библиотеки JavaScript , в полнофункциональную версию, состоящую всего из шести символов. [11]
Методы кодирования
[ редактировать ]Код JSFuck чрезвычайно «многословен»: в JavaScript код alert("Hello World!")
, вызывающий открытие всплывающего окна с текстом «Hello world», имеет длину 21 символ. В JSFuck тот же код имеет длину 4325 символов. [12] Для некоторых отдельных символов требуется гораздо более 1000 символов при расширении как JSFuck. В этом разделе представлен обзор того, как работает это расширение.
Числа
[ редактировать ]Число 0 создано +[]
, где []
это пустой массив и +
— это унарный плюс , используемый для преобразования правой части в числовое значение (здесь ноль).Число 1 образуется как +!![]
или +!+[]
, где логическое значение true
(выраженный как !![]
или !+[]
в JSFuck) преобразуется в числовое значение 1 с помощью добавленного к нему знака плюс.Цифры от 2 до 9 образуются суммированием true
нужное количество раз. Например, в JavaScript true + true
= 2 и true
= !![]
= !+[]
, следовательно, 2 можно записать как !![]+!![]
или !+[]+!+[]
. Остальные цифры следуют аналогичной схеме.Целые числа, состоящие из двух или более цифр, записываются в виде строки путем объединения однозначных массивов с помощью оператора плюс.Например, строка "10"
может быть выражено в JavaScript как [1] + [0]
.Заменяя цифры соответствующими расширениями JSFuck, получаем [+!+[]]+[+[]]
.Чтобы получить числовое значение вместо строки, нужно заключить предыдущее выражение в круглые или квадратные скобки и добавить плюс, что даст 10
= +([+!+[]]+[+[]])
.
Письма
[ редактировать ]Некоторые буквы можно получить в JSFuck, обращаясь к отдельным символам в строковых представлениях простых логических или числовых значений, таких как "false"
, "true"
, "NaN"
, "undefined"
с индексатором (число в квадратных скобках). Для создания других букв необходимы другие приемы — например, путем приведения строки 1e1000
в число, которое дает Infinity
, что, в свою очередь, делает букву y
доступный. [13]
Ниже приведен список примитивных значений, используемых в качестве строительных блоков для создания самых простых букв.
Ценить JSFuck false
![]
true
!![]
или!+[]
NaN
+[![]]
undefined
[][[]]
Infinity
+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])
Пример: Создание буквы «а»
[ редактировать ]"a"
: взято из строки "false"
. Второй символ «false» — это a, доступ к которому можно получить с помощью:
"false"[1]
."false"
можно сделать изfalse+[]
, то есть логическая константа false плюс пустой массив.(false+[])[1]
: Мы пишем false как![]
(отрицание применяется к пустому массиву).(![]+[])[1]
: 1 — число, мы можем записать его как+true
.(![]+[])[+true]
: Поскольку ложь![]
, правда!![]
.(![]+[])[+!![]]
– что оценивается как «а».
Доказательство. В JavaScript alert((![]+[])[+!![]])
делает то же самое, что и alert("a")
. [14]
Другие конструкции
[ редактировать ]The Function
Конструктор можно использовать для запуска выполнения кода JavaScript, содержащегося в строке, как если бы это был собственный JavaScript. Так, например, утверждение alert(1)
эквивалентно Function("alert(1)")()
. Function
Конструктор можно получить в JSFuck, обратившись к свойству конструктора известной функции, например []["filter"]
( Array.prototype.filter
) или []["flat"]
( Array.prototype.flat
) в современных браузерах. А потом alert(1)
становится []["flat"]["constructor"]("alert(1)")()
.
Таблица символов
[ редактировать ]Ниже перечислены персонажи с самыми короткими расширениями JSFuck. Другие символы UTF-8 также могут быть выражены, но при этом будет генерироваться значительно более длинный код.
Характер JSFuck +
(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[!+[]+!+[]]
.
(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]
0
+[]
1
+!![]
или+!+[]
2
!![]+!![]
или!+[]+!+[]
3
!![]+!![]+!![]
или!+[]+!+[]+!+[]
4
!![]+!![]+!![]+!![]
или!+[]+!+[]+!+[]+!+[]
5
!![]+!![]+!![]+!![]+!![]
или!+[]+!+[]+!+[]+!+[]+!+[]
6
!![]+!![]+!![]+!![]+!![]+!![]
или!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
7
!![]+!![]+!![]+!![]+!![]+!![]+!![]
или!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
8
!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]
или!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
9
!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]
или!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]
a
(![]+[])[+!+[]]
c
([]+[][(![]+[])[+!![]]+(!![]+[])[+[]]])[!![]+!![]+!![]]
d
([][[]]+[])[!+[]+!+[]]
e
(!![]+[])[!+[]+!+[]+!+[]]
f
(![]+[])[+[]]
i
([![]]+[][[]])[+!+[]+[+[]]]
I
(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))+[])[+[]]
l
(![]+[])[!+[]+!+[]]
N
(+[![]]+[])[+[]]
n
([][[]]+[])[+!+[]]
o
(!![]+[][(![]+[])[+!![]]+(!![]+[])[+[]]])[+!![]+[+[]]]
r
(!+[]+[])[+!+[]]
s
(![]+[])[!+[]+!+[]+!+[]]
t
(!+[]+[])[+[]]
u
([][[]]+[])[+[]]
y
(+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))])[+!+[]+[+[]]]
Безопасность
[ редактировать ]Не имея отличительных особенностей «обычного» JavaScript, методы обфускации, такие как JSFuck, могут помочь вредоносному коду JavaScript обойти системы предотвращения вторжений. [15] или фильтры контента. Например, отсутствие буквенно-цифровых символов в JSFuck и несовершенный фильтр контента позволили продавцам встраивать произвольные скрипты JSFuck на свои аукционные страницы eBay. [10]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Джейн Бэйли/ The Daily WTF : «Ставки на безопасность». http://thedailywtf.com/articles/bidding-on-security
- ^ Хасэгава, Ёсуке (10 июля 2009 г.). «jjencode — кодируйте любую программу JavaScript, используя только символы» . utf-8.jp . Архивировано из оригинала 15 июля 2009 г. Проверено 25 октября 2017 г.
- ^ Хасегава, Ёсуке (июль 2009 г.). «UTF-8.jp [28 июля 2009 г.] » . utf-8.jp . Архивировано из оригинала 28 июля 2009 г. Проверено 25 октября 2017 г.
- ^ «Еще один бесполезный конкурс (но веселый!) Для запуска произвольного JS-кода требуется меньше символов» . sla.ckers.org . 14 января 2010 г. Архивировано из оригинала 1 марта 2011 г. Проверено 25 октября 2017 г.
- ^ "js-noalnum_com.php" . diskogscounter.getfreehosting.co.uk . Архивировано из оригинала 1 марта 2010 г. Проверено 25 октября 2017 г.
- ^ Айко, Кендзи (ноябрь 2010 г.). "JSF*ck - []()!+" . utf-8.jp . Архивировано из оригинала 1 декабря 2010 г. Проверено 25 октября 2017 г.
- ^ Хасегава, Ёсуке (ноябрь 2010 г.). "UTF-8.jp [2010-11-30] " . utf-8.jp . Архивировано из оригинала 30 ноября 2010 г. Проверено 25 октября 2017 г.
- ^ Клеппе, Мартин (16 июля 2012 г.). «Коммит · aemkei/jsfuck» . github.com . Проверено 25 октября 2017 г.
- ^ Клеппе, Мартин (сентябрь 2012 г.). «Отчет о сайте www.jsfuck.com» . тулбар.netcraft.com . Проверено 25 октября 2017 г.
- ^ Jump up to: а б Дэн Гудин (3 февраля 2016 г.). «eBay не планирует исправлять «серьезную» ошибку, позволяющую распространять вредоносное ПО [обновлено]» . Арс Техника .
- ^ https://github.com/fasttime/jquery-screwed JavaScript-библиотека jQuery, состоящая всего из шести разных символов: ! ( ) + [ ]
- ^ "JScrewIt" . JScrewIt . Проверено 13 июня 2021 г.
- ^ http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html «Остерегайтесь Brainfuck: JavaScript преследует вас!»
- ^ Адаптировано из: https://esolangs.org/wiki/JSFuck.
- ^ Ре Медина, Матиас А. (2012-09). Обход WAF с помощью небуквенно-цифрового XSS. Получено с http://blog.infobytesec.com/2012/09/bypassing-wafs-with-non-alphanumeric-xss.html .
- ^ Пасха, Брэнди (02 апреля 2020 г.). «Полностью человек, полностью машина: риторика цифрового развоплощения в программировании». Риторический обзор . 39 (2): 202–215. дои : 10.1080/07350198.2020.1727096 . ISSN 0735-0198 . S2CID 219665562 .
Внешние ссылки
[ редактировать ]- JSFuck — напишите любой JavaScript с 6 символами: []()!+ — веб-приложение для кодирования JavaScript в JSFuck
- JavaScript-код вышеупомянутого конвертера
- JScrewIt — еще один инструмент для преобразования JavaScript в JSFuck с оптимизацией для конкретной среды.
- Эсоланг — Вики по эзотерическим языкам программирования