XSS in JavaScript

2

Recentemente ho scoperto una cosa in un'applicazione web e ho scoperto che l'URL si riflette nell'origine della pagina, il che lo rende un po 'ovvio per XSS, ma l'input dall'URL che si riflette sulla sorgente viene assegnato all'interno di una <script> tag.

URL:

http://www.xyz.com/back?majorID=usdfg&Action=Themesdig&pbPage=vulnerable area&QI.fd_id=random.3232

Codice:

<script type="text/javascript">
var _TM = {
    cc : 'RUP'
    ,ll : 'en-US'
    ,mkt : 'IN'
    ,geo : 'IN' 

        ,pagename : 'vulnerable area'
        ,pagetype : 'Custom'
        ,channel : 'Custom'

    }
</script>

Quindi al primo momento, ho pensato che un alert('xxx') sia sufficiente per creare un POC, ma l'inserimento di allerta o qualsiasi altra cosa sta portando il codice a diventare difettoso e non renderizzabile e non posso chiudere il tag dello script mentre l'applicazione sta disinfettando < , > e ' al loro rappresentante HTML.

E la webapp accetta anche valori esadecimali. Ho inserito Carriage Return% 0D (solo per confermare che stanno accettando) e ha funzionato.
Quindi, come posso eseguire JavaScript in questa situazione e creare POC?

In questi giorni, ho ottenuto quasi il completamento della risposta ' };alert(13);var misc={a:b , ma l'unico problema è ' all'inizio. Ci deve essere un modo per superare anche il problema.

    
posta user38257 21.09.2014 - 14:41
fonte

2 risposte

3

So at first moment i thought an alert('xxx') is enough to create a POC but inserting alert or any thing else is leading the code to become faulty

Rompere il codice è di solito un buon segno. Un errore di sintassi può mostrare che la vittima non sta eseguendo gli escape corretti per mantenere il codice valido. Guarda la sorgente generata per vedere cosa produce per il tuo input. Se hai fatto solo alert('xxx') e il sito di destinazione non è riuscito a codificarlo, ottieni:

    ,pagename : 'alert('xxx')'

che è davvero un errore di sintassi. Dovresti (1) sfuggire al contesto in cui ti stai iniettando, con un ' ; (2) riordinare il contesto circostante terminando l'istruzione var , con }; ; (3) inserisci il tuo carico utile; (4) mascherare la roba finale in modo che non causi altri errori. es .: '};alert('xxx');/*

Se il sito di destinazione sfugge a ' , guarda gli altri caratteri che sono speciali nel contesto di una stringa letterale JavaScript. In particolare: il backslash, che introduce sequenze di escape. Se il target ha ricordato di uscire da ' a \' , ma non ha evitato il backslash stesso, dandogli \' finirebbe con l'escape a \' , che è un letterale backslash e quindi un apice, terminando il stringa letterale e ti offre la possibilità di sfruttarlo di nuovo.

Gli altri caratteri che sono speciali in stringhe di stringhe JavaScript sono newline, incluse le nuove righe Unicode U + 2028 / U + 2029, ma di solito non si può fare molto con queste perché sono semplicemente vietate e infrangono il codice. Ci sono momenti in cui la terminazione anticipata di un pezzo di codice può essere utilizzata in un attacco, ma non è la semplice iniezione diretta di cui stiamo parlando qui.

i thought of inserting bunch of delete hex encode (i.e %127) to delete the pagetype and channel but the webapp is thinking %127 as %12 and failing my second plan also.

127 è decimale non esadecimale. Volevi %7F .

I caratteri di eliminazione non hanno poteri speciali in JavaScript o HTML, non sarebbe possibile sfuggire al contesto letterale della stringa in questo modo. Il carattere delete cancellerebbe solo i caratteri precedenti quando è stato digitato in un buffer di terminale. I codici terminali sono un attacco valido contro le app che guidano altre applicazioni della console facendo finta di input da parte dell'utente, ma probabilmente non è qualcosa che un'applicazione web farà mai.

    
risposta data 21.09.2014 - 17:39
fonte
0

Prova ad inserire

' + alert('xxx') + '

Questo renderà il codice sorgente sopra come

pagename : '' + alert('xxx') + ''

Questo significa in inglese semplice "Il valore di _TM.pagename è la stringa che si ottiene quando si concatena una stringa vuota, il valore restituito di chiamare alert('xxx') e un'altra stringa vuota". Per creare questa stringa, verrà chiamato alert('xxx') .

Poiché l'avviso non restituisce nulla, il nome della pagina sarà la stringa "undefined" . Si noti che questo potrebbe causare un comportamento imprevisto in un momento successivo nell'applicazione Web.

    
risposta data 25.09.2014 - 11:20
fonte

Leggi altre domande sui tag