Come posso eseguire un XSS con queste condizioni?

6

Sto cercando di imparare i test di penetrazione e ho scaricato un'applicazione vulnerabile chiamata "Bodgeit Store". Ho finito quasi tutte le sfide tranne una che è l'esecuzione di un attacco Cross-Site Scripting. Ho controllato il codice sorgente dell'app e ho trovato il seguente codice Java:

if (request.getMethod().equals("POST") && comments != null)
{
    anticsrf = request.getParameter("anticsrf");
        if (anticsrf != null && anticsrf.equals(request.getSession().getAttribute("anticsrf")))
            {
                // Strip script tags, because that will make everything alright...
                comments = comments.replace("<script>", "");
                comments = comments.replace("</script>", "");
                // And double quotes, just to make sure
                comments = comments.replace("\"", "");
            .................
            }
}

La sfida dice:

"Display a popup using: <script>alert("XSS")</script>"

ma guardando la fonte, scopriamo che i tag <script> e </script> sono sostituiti da caratteri nulli. Inoltre, non posso effettuare una richiesta GET perché il codice verifica anche se la richiesta è o meno una richiesta POST.

Ho provato ed è riuscito ad eseguire una finestra di avviso usando altri metodi come l'uso di un file .js esterno e così, ma voglio davvero scoprire come si può completare questa sfida. Per favore, dammi alcuni suggerimenti su come risolvere il problema.

    
posta curiousguy 07.05.2012 - 12:36
fonte

5 risposte

12

Oltre a la risposta semplice e semplice di Gumbo , un'altra possibilità sarebbe quella di utilizzare l'ultima chiamata replace() per ignorare quelle precedenti, per esempio in questo modo:

<scr"ipt>alert('XSS')</scr"ipt>

In realtà, sospetto che questa potrebbe essere la soluzione che l'autore della sfida si aspettava: non c'è molto senso spogliando le doppie virgolette eccetto per permettere deliberatamente questo particolare attacco, e il "giusto per assicurati che "il commento faccia addirittura attenzione ad esso.

Ovviamente, anche se il codice non non elargisce le virgolette doppie, puoi comunque farlo:

<scr</script>ipt>alert('XSS')</scr</script>ipt>
    
risposta data 07.05.2012 - 20:11
fonte
3

Dopo aver esaminato di nuovo la tua domanda, finalmente vedo che cosa la sfida sta cercando di ottenere. Si noti come il codice anti-XSS è racchiuso da un'istruzione if che verifica la presenza di un parametro anticsrf e se è uguale all'oggetto anticsrf presente nell'oggetto sessione dell'utente. Rompendo una di queste due condizioni, è possibile rendere efficace il codice sopra ( <script>alert("XSS")</script> ). In altre parole, se si esclude il parametro anticsrf dalla richiesta o si modifica il parametro anticsrf nella richiesta in qualcosa di arbitrario, il parametro comment verrà riflesso letteralmente perché il blocco di codice che elimina il codice XSS verrà saltato.

Altre informazioni da prendere in considerazione:

Il contenitore di tag <script> non è l'unico posto dove puoi XSS. Dai un'occhiata agli altri tag HTML e cosa possono fare. Ad esempio, il seguente funziona con <img> tag:

<img src=javascript:alert('hi'); />

Esistono anche i gestori di eventi onload , onmouseover , ecc. associati a un intero gruppo di tag in HTML che potrebbero essere sfruttati a tale scopo. Il mio miglior suggerimento sarebbe quello di dare un'occhiata alla specifica HTML per avere più idee. Se diventerai un tester per la penna web, sicuramente vorresti armarti di quella conoscenza.

    
risposta data 07.05.2012 - 15:35
fonte
1

Modulo di invio automatico:

<html>
    <body onload="document.forms[0].submit()">
        <form method="POST" action="...">
        ...
        </form>
    </body>
</html>

XSS senza tag script:

<img src="missing" onerror="..." />
    
risposta data 07.05.2012 - 15:17
fonte
1

Mi piacciono alcuni degli altri messaggi inventivi qui per le risposte.

Ecco alcuni semplici e amp; stupidi che mi sono venuti in mente subito:

<script >alert('XSS')</script >
<SCRIPT>alert('XSS')</SCRIPT>
    
risposta data 16.05.2012 - 22:33
fonte
-1

Potresti inserire altri tipi di spazio e amp; tabulatori tra i tag per bypassare il filtro.

Ad esempio:

<scr&#x9ipt>alert('XSS')</scr&#x9ipt>

Il codice sopra inserirà una tabulazione tra r & io in entrambi i tag, rendendo così il codice inefficace.

Per superare lo script PHP, puoi provare a usare accenti gravi (') che sono usati in HTML ma non filtrati dalla maggior parte dei filtri scritti a mano.

    
risposta data 09.02.2013 - 21:38
fonte

Leggi altre domande sui tag