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