exploit document.write con input utente non criticato

1

Sto provando a inserire javascript in un file script js ma non funziona.

Ho la seguente configurazione:

file html con javascript-file include (tutto inline js è bloccato!)

Welcome, <script src="js/domxss.js" type="text/javascript"></script>

sorgente javascript di js / domxss.js:

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
document.write(unescape(userInput));

Ovviamente potrei semplicemente richiedere

domain.com/index.html?user=<script>alert(1)</script> 

e verrebbe eseguito, ma tutti i jline inline vengono bloccati dal mio Content-Security-Policy. Quindi quello che sto cercando di fare è uscire da

document.write((userInput));

con qualcosa di simile:

domain.com/index.html?user=bob); alert(1

così posso ottenere qualcosa di simile a questo:

document.write(bob);alert(1);

Qualcuno ha un'idea su come potrei ottenerlo? Non sono legato a document.write, sto solo cercando un esempio XSS basato su DOM in cui posso iniettare JS direttamente nel file di script piuttosto che stamparlo come codice inline.

Scusa se sembra una domanda di base, ma non mi è familiare con JS.

Grazie per l'aiuto:)

    
posta mohrphium 02.03.2014 - 20:31
fonte

1 risposta

2

Per dirla semplicemente, non puoi perché il tuo payload bob); alert(1 è una stringa, e JavaScript conosce una stringa in modo che non la eseguirà. I caratteri parentesi e punti e virgola possono trovarsi all'interno della stringa senza essere eseguiti. Questo codice potrebbe essere vulnerabile se, ad esempio, si tentasse di concatenare il payload in un'istruzione eval() . Questo perché eval eseguirà il codice all'interno della stringa risultante.

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
eval("document.write('" + decodeURI(userInput) + "');");

Quindi domain.com/index.html?user=bob');%20alert('1 comporterà la seguente stringa eseguita come JavaScript:

document.write('bob'); alert('1');

( Ecco perché eval () è generalmente una cattiva idea )

Tuttavia, una buona politica di sicurezza dei contenuti probabilmente bloccherebbe anche l'input dell'utente in eval (), quindi questo metodo potrebbe non funzionare. Dipende dalla politica restituita dal server o dai controlli predefiniti che il browser potrebbe caricare se non ne viene specificato uno.

Alternative a eval ()

Altri modi pericolosi in cui uno sviluppatore potrebbe valutare accidentalmente i dati controllabili dall'utente senza sanificazione o convalida (che potrebbe non essere catturato da un CSP predefinito o un filtro XSS lato client).

Il costruttore di funzioni (può definire il corpo della funzione come una stringa):

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
var terribleFunction = new Function( "document.write('" + decodeURI(userInput) + "');" );
terribleFunction();

Un URI di dati :

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
var terribleScript = document.createElement('script');
terribleScript.src = 'data:text/javascript,' + encodeURIComponent("document.write('" + decodeURI(userInput) + "');");
document.body.appendChild( terribleScript );

setTimeout (anche se penso che questo metodo sia essenzialmente uguale a eval ()):

var pos=document.URL.indexOf("user=")+5;
var userInput=document.URL.substring(pos,document.URL.length);
setTimeout( "document.write('" + decodeURI(userInput) + "');" , 100 );
    
risposta data 02.03.2014 - 21:59
fonte

Leggi altre domande sui tag