JSFuck


JSFuck es una esotérica subconjunto de JavaScript , donde el código está escrito utilizando sólo seis caracteres : [, ], (, ), !, y +. El nombre se deriva de Brainfuck , un lenguaje de programación esotérico que también usa un alfabeto minimalista de solo puntuación . A diferencia de Brainfuck , que requiere su propio compilador o intérprete , JSFuck es un código JavaScript válido, lo que significa que los programas JSFuck se pueden ejecutar en cualquier navegador o motor web.que interpreta JavaScript. JSFuck es capaz de recrear toda la funcionalidad de JavaScript utilizando un conjunto de caracteres tan limitado porque JavaScript es un lenguaje de programación débilmente tipado y permite la evaluación de cualquier expresión como cualquier tipo. [1]

En julio de 2009, Yosuke Hasegawa creó una aplicación web llamada jjencode que podía codificar JavaScript arbitrario en una forma ofuscada utilizando solo los 18 símbolos []()!+,\"$.:;_{}~=. [2] [3] En enero de 2010, se llevó a cabo una competencia informal en el foro "Ofuscación" del sitio de seguridad de la aplicación web sla.ckers.org para encontrar una manera de reducir el número mínimo de caracteres requerido a menos de ocho: []()!+,/. Los colaboradores del hilo lograron eliminar la necesidad de los personajes ,y /. [4] En marzo de 2010, estaba disponible un codificador en línea llamado JS-NoAlnum que utilizaba solo el conjunto final de seis caracteres. [5]A fines de 2010, Hasegawa puso a disposición un nuevo codificador llamado JSF * ck que también usaba solo el mínimo de seis caracteres. [6] [7] En 2012, Martin Kleppe creó un proyecto "jsfuck" en GitHub , [8] y un sitio web JSFuck.com con una aplicación web que usa esa implementación del codificador. [9]

JSFuck se puede utilizar para evitar la detección de código malicioso enviado en sitios web , por ejemplo, en ataques de secuencias de comandos entre sitios (XSS). [10] Otro uso potencial de JSFuck radica en la ofuscación del código . Se ha utilizado una versión optimizada de JSFuck para codificar jQuery , una biblioteca de JavaScript , en una versión completamente funcional escrita con solo seis caracteres. [11]

El código JSFuck es extremadamente "detallado": en JavaScript, el código , que hace que se abra una ventana emergente con el texto "Hola mundo", tiene 21 caracteres. En JSFuck, el mismo código tiene una longitud de 4325 caracteres. [12] Ciertos caracteres individuales requieren mucho más de 1000 caracteres cuando se expanden como JSFuck. Esta sección ofrece una descripción general de cómo funciona esta expansión.alert("Hello World!")

El número 0 es creado por +[], donde []es la matriz vacía y +es el más unario , que se utiliza para convertir el lado derecho en un valor numérico (cero aquí). El número 1 se forma como +!![]o +!+[], donde el valor booleanotrue (expresado como !![]o !+[]en JSFuck) se convierte en el valor numérico 1 mediante el signo más antepuesto. Los dígitos del 2 al 9 se forman sumando trueel número apropiado de veces. Por ejemplo, en JavaScript true + true= 2 y true= !![]= !+[], por lo tanto, 2 se puede escribir como !![]+!![]o !+[]+!+[]. Otros dígitos siguen un patrón similar. Los enteros que constan de dos o más dígitos se escriben, como una cadena, porconcatenando matrices de 1 dígito con el operador más. Por ejemplo, la cadena "10"se puede expresar en JavaScript como [1] + [0]. Reemplazando los dígitos con las respectivas expansiones JSFuck, esto cede [+!+[]]+[+[]]. Para obtener un valor numérico en lugar de una cadena, se debe encerrar la expresión anterior entre paréntesis o corchetes y anteponer un signo más, dando como resultado 10= +([+!+[]]+[+[]]).

Algunas letras se pueden obtener en JSFuck accediendo a caracteres individuales en las representaciones de cadena de valores booleanos o numéricos simples como,,, con "false"un indexador ( un número entre corchetes). Se necesitan otros trucos para producir otras letras, por ejemplo, al convertir la cadena en un número, lo que da , lo que a su vez hace que la letra sea ​​accesible. [13]"true""NaN""undefined"1e1000Infinityy