JSFuck es un subconjunto esotérico de JavaScript , donde el código se escribe usando solo seis caracteres : , , , , , y . El nombre deriva de Brainfuck , un lenguaje de programación esotérico que también usa un alfabeto minimalista compuesto únicamente por signos de puntuación . A diferencia de Brainfuck, que requiere su propio compilador o intérprete , JSFuck es código JavaScript válido, lo que significa que los programas JSFuck se pueden ejecutar en cualquier navegador web o motor que interprete JavaScript. JSFuck puede recrear toda la funcionalidad de JavaScript usando un conjunto tan limitado de caracteres porque JavaScript permite la evaluación de cualquier expresión como cualquier tipo. [ 1 ][]()!+
Historia
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 aplicaciones web sla.ckers.org para encontrar una manera de reducir el número mínimo de caracteres requeridos a menos de ocho: []()!+,/. Los colaboradores del hilo lograron eliminar la necesidad de los caracteres ,y /. [ 4 ] A partir de marzo de 2010, estaba disponible un codificador en línea llamado JS-NoAlnum que utilizaba solo el conjunto final de seis caracteres. [ 5 ] A finales de 2010, Hasegawa puso a disposición un nuevo codificador llamado JSF*ck que también utilizaba solo los seis caracteres mínimos. [ 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 utiliza esa implementación del codificador. [ 9 ]
JSFuck puede utilizarse para eludir la detección de código malicioso enviado a sitios web , por ejemplo, en ataques de secuencias de comandos entre sitios (XSS). [ 10 ] Otro uso potencial de JSFuck reside en la ofuscación de 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 tan solo seis caracteres. [ 11 ]
Métodos de codificación
El código de JSFuck es extremadamente extenso: en JavaScript, el código que abre una ventana emergente con el texto "Hola mundo" tiene 22 caracteres. En JSFuck, el mismo código tiene 6448 caracteres. [ 12 ] Algunos caracteres individuales requieren mucho más de 1000 caracteres al expandirse como JSFuck. Esta sección ofrece una descripción general de cómo funciona esta expansión.alert("Hello, World!")
Números
El número 0 se crea mediante +[], donde es el array[] vacío y es el signo más unario , utilizado para convertir el lado derecho a un valor numérico (cero en este caso). El número 1 se forma como o , donde el valor booleano (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 el número apropiado de veces. Por ejemplo, en JavaScript = 2 y = = , 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, concatenando arrays de 1 dígito con el operador más. Por ejemplo, la cadena se puede expresar en JavaScript como . Al reemplazar los dígitos con las expansiones respectivas de JSFuck, esto produce . Para obtener un valor numérico en lugar de una cadena, se encerraría la expresión anterior entre paréntesis o corchetes y se antepondría un signo más, lo que produce = .++!![]+!+[]true!![]!+[]truetrue + truetrue!![]!+[]!![]+!![]!+[]+!+[]"10"[1] + [0][+!+[]]+[+[]]10+([+!+[]]+[+[]])
Letras
Algunas letras se pueden obtener en JSFuck accediendo a caracteres individuales en las representaciones de cadena de valores booleanos o numéricos simples como "false", "true", "NaN", "undefined"con un indexador (un número entre corchetes). Se necesitan otros trucos para producir otras letras; por ejemplo, convirtiendo la cadena 1e1000a un número, lo que da Infinity, lo que a su vez hace que la letra ysea accesible. [ 13 ]
A continuación se muestra una lista de valores primitivos utilizados como bloques de construcción para producir las letras más simples.
Ejemplo: Creando la letra "a"
"a": Tomado de la cadena "false". El segundo carácter de "false" es una, a la que se puede acceder con:
"false"[1]."false"se puede crear a partir defalse+[], es decir, la constante booleana false más una matriz vacía.(false+[])[1]: Escribimos falso como.(![]+[])[1]: 1 es un número, podemos escribirlo como+true.(![]+[])[+true]: Dado que falso es![], verdadero es!![].(![]+[])[+!![]]– que se evalúa como "a".
Prueba: En JavaScript, alert((![]+[])[+!![]])hace lo mismo que alert("a"). [ 14 ]
Otras construcciones
El Functionconstructor se puede usar para activar la ejecución de código JavaScript contenido en una cadena como si fuera JavaScript nativo. Por ejemplo, la instrucción alert()es equivalente a Function("alert()")(). El Functionconstructor se puede obtener en JSFuck accediendo a la propiedad constructor de una función conocida, como []["filter"]( Array.prototype.filter), por lo que alert()se puede ejecutar con []["filter"]["constructor"]("alert()")(). En los navegadores modernos hay funciones con nombres más cortos disponibles, como []["flat"]( Array.prototype.flat) [ 15 ] y []["at"]( Array.prototype.at). [ 16 ]
Tabla de personajes
A continuación se muestran los caracteres con las expansiones JSFuck más cortas. También se pueden expresar otros caracteres UTF-8 , pero esto generará un código considerablemente más largo.
Seguridad
Al carecer de las características distintivas del JavaScript "habitual", las técnicas de ofuscación como JSFuck pueden ayudar al código JavaScript malicioso a eludir los sistemas de prevención de intrusiones [ 17 ] o los filtros de contenido. Por ejemplo, la falta de caracteres alfanuméricos en JSFuck y un filtro de contenido defectuoso permitieron a los vendedores insertar scripts JSFuck arbitrarios en sus páginas de subastas de eBay. [ 10 ]
Véase también
Referencias
- ↑ Jane Bailey/ The Daily WTF : "Subasta de seguridad". https://thedailywtf.com/articles/bidding-on-security
- ↑ Hasegawa, Yosuke (10 de julio de 2009). "jjencode - Codifica cualquier programa JavaScript usando solo símbolos" . utf-8.jp . Archivado del original el 15 de julio de 2009. Consultado el 25 de octubre de 2017 .
- ↑ Hasegawa, Yosuke (julio de 2009). "UTF-8.jp [ 2009-07-28 ] " . utf-8.jp . Archivado del original el 28 de julio de 2009. Recuperado el 25 de octubre de 2017 .
- ↑ "Otro concurso inútil (¡pero divertido!) Se necesitan menos caracteres para ejecutar código JS arbitrario" . sla.ckers.org . 14 de enero de 2010. Archivado del original el 1 de marzo de 2011. Consultado el 25 de octubre de 2017 .
- ↑ "js-noalnum_com.php" . discogscounter.getfreehosting.co.uk . Archivado del original el 1 de marzo de 2010. Consultado el 25 de octubre de 2017 .
- ↑ Aiko, Kenji (noviembre de 2010). "JSF*ck - [ ] ()!+" . utf-8.jp . Archivado del original el 1 de diciembre de 2010. Recuperado el 25 de octubre de 2017 .
- ↑ Hasegawa, Yosuke (noviembre de 2010). "UTF-8.jp [ 2010-11-30 ] " . utf-8.jp . Archivado del original el 30-11-2010 . Recuperado el 25-10-2017 .
- ↑ Kleppe, Martin (2012-07-16). "Commits · aemkei/jsfuck" . github.com . Recuperado el 2017-10-25 .
- ^ Kleppe, Martín (septiembre de 2012). "Informe del sitio para www.jsfuck.com" . barra de herramientas.netcraft.com . Consultado el 25 de octubre de 2017 .
- 1 2 Dan Goodin (3 de febrero de 2016). "eBay no tiene planes de solucionar el error "grave" que permite la distribución de malware [ Actualizado ] " . Ars Technica .
- ↑ https://github.com/fasttime/jquery-screwed Biblioteca JavaScript jQuery compuesta únicamente por seis caracteres diferentes: ! ( ) + [ ]
- ↑ "JScrewIt" . JScrewIt . Consultado el 13 de junio de 2021 .
- ↑ https://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html "¡Cuidado con el cerebro: JavaScript te persigue!"
- ↑ Adaptado de: https://esolangs.org/wiki/JSFuck
- ↑ Datos de compatibilidad de Array.prototype.flat() en MDN
- ↑ Datos de compatibilidad de Array.prototype.at() en MDN
- ↑ Ré Medina, Matías A. (2012-09). Bypassing WAFs with non-alphanumeric XSS. Recuperado de http://blog.infobytesec.com/2012/09/bypassing-wafs-with-non-alphanumeric-xss.html .
- ↑ Easter, Brandee (2 de abril de 2020). "Totalmente humano, totalmente máquina: retóricas del descorporalismo digital en la programación". Rhetoric Review . 39 (2): 202– 215. doi : 10.1080/07350198.2020.1727096 . ISSN 0735-0198 . S2CID 219665562 .
Enlaces externos
- JSFuck - Escribe cualquier JavaScript con 6 caracteres: [ ] ()!+ – aplicación web para codificar JavaScript a JSFuck
- Código JavaScript del convertidor mencionado anteriormente
- JScrewIt : otra herramienta para convertir JavaScript a JSFuck, con optimizaciones específicas para cada entorno.
- Esolang - La wiki de lenguajes de programación esotéricos
- Lenguajes de programación esotéricos
- JavaScript