Jump to content

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, доступ к которому можно получить с помощью:

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

Доказательство. В 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]

См. также

[ редактировать ]
  • Brainfuck — эзотерический язык программирования, созданный в 1993 году Урбаном Мюллером. [16]
  1. ^ Джейн Бэйли/ The Daily WTF : «Ставки на безопасность». http://thedailywtf.com/articles/bidding-on-security
  2. ^ Хасэгава, Ёсуке (10 июля 2009 г.). «jjencode — кодируйте любую программу JavaScript, используя только символы» . utf-8.jp . Архивировано из оригинала 15 июля 2009 г. Проверено 25 октября 2017 г.
  3. ^ Хасегава, Ёсуке (июль 2009 г.). «UTF-8.jp [28 июля 2009 г.] » . utf-8.jp . Архивировано из оригинала 28 июля 2009 г. Проверено 25 октября 2017 г.
  4. ^ «Еще один бесполезный конкурс (но веселый!) Для запуска произвольного JS-кода требуется меньше символов» . sla.ckers.org . 14 января 2010 г. Архивировано из оригинала 1 марта 2011 г. Проверено 25 октября 2017 г.
  5. ^ "js-noalnum_com.php" . diskogscounter.getfreehosting.co.uk . Архивировано из оригинала 1 марта 2010 г. Проверено 25 октября 2017 г.
  6. ^ Айко, Кендзи (ноябрь 2010 г.). "JSF*ck - []()!+" . utf-8.jp . Архивировано из оригинала 1 декабря 2010 г. Проверено 25 октября 2017 г.
  7. ^ Хасегава, Ёсуке (ноябрь 2010 г.). "UTF-8.jp [2010-11-30] " . utf-8.jp . Архивировано из оригинала 30 ноября 2010 г. Проверено 25 октября 2017 г.
  8. ^ Клеппе, Мартин (16 июля 2012 г.). «Коммит · aemkei/jsfuck» . github.com . Проверено 25 октября 2017 г.
  9. ^ Клеппе, Мартин (сентябрь 2012 г.). «Отчет о сайте www.jsfuck.com» . тулбар.netcraft.com . Проверено 25 октября 2017 г.
  10. ^ Jump up to: а б Дэн Гудин (3 февраля 2016 г.). «eBay не планирует исправлять «серьезную» ошибку, позволяющую распространять вредоносное ПО [обновлено]» . Арс Техника .
  11. ^ https://github.com/fasttime/jquery-screwed JavaScript-библиотека jQuery, состоящая всего из шести разных символов: ! ( ) + [ ]
  12. ^ "JScrewIt" . JScrewIt . Проверено 13 июня 2021 г.
  13. ^ http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html «Остерегайтесь Brainfuck: JavaScript преследует вас!»
  14. ^ Адаптировано из: https://esolangs.org/wiki/JSFuck.
  15. ^ Ре Медина, Матиас А. (2012-09). Обход WAF с помощью небуквенно-цифрового XSS. Получено с http://blog.infobytesec.com/2012/09/bypassing-wafs-with-non-alphanumeric-xss.html .
  16. ^ Пасха, Брэнди (02 апреля 2020 г.). «Полностью человек, полностью машина: риторика цифрового развоплощения в программировании». Риторический обзор . 39 (2): 202–215. дои : 10.1080/07350198.2020.1727096 . ISSN   0735-0198 . S2CID   219665562 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b069342414a67ea1bb4392e76ceb023d__1721480280
URL1:https://arc.ask3.ru/arc/aa/b0/3d/b069342414a67ea1bb4392e76ceb023d.html
Заголовок, (Title) документа по адресу, URL1:
JSFuck - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)