Come evitare XSS dall'URL

2

Ho trovato una vulnerabilità XSS che viene sfruttata aggiungendo un attacco nei parametri URL.

Ad es. l'URL originale site.com/?s=login&m=forgotten
E l'URL di attacco site.com/?s=login&m=forgotten" onload=alert(966) bad="

Ora vorrei impedire questo attacco. Qualcuno può aiutarmi?

    
posta Vishal 02.04.2014 - 16:35
fonte

2 risposte

3

Disinfetta i tuoi input, sfuggendo ai caratteri speciali HTML. In PHP questo è fatto con htmlspecialcharacters . Assicurati di non fornire un flag che impedisca ai caratteri speciali html di sfuggire al tipo di preventivo che utilizzi.

Il tuo problema è che il tuo URL è http://example.com/?s=login&m=forgotten" onload=alert(966) bad=" , il tuo codice PHP che è probabilmente qualcosa del tipo:

<?php
$var = $_GET['m'];  
echo '<a href="$var">something</a>';

ma su semplice sostituzione diretta con l'input non valido diventa:

<a href="forgotten" onload=alert(966) bad=">something</a>';

Il problema deriva dal " senza caratteri di escape. La funzione PHP sanitizzante htmlspecialcharacters cambierà la " in una &quot; , quindi con:

<?php
$var = htmlspecialcharacters($_GET['m']);  
echo '<a href="$var">something</a>';

l'HTML reso sarà:

<a href="forgotten&quot; onload=alert(966) bad=&quot;">something</a>';

che il tuo browser interpreterà come un link gigante a forgotten&quot; onload=alert(966) bad=&quot; , invece di un tag html che contiene l'attributo onload .

Personalmente, mi sposterei da PHP e ad un framework web che inizia con la sicurezza in mente; ad es., HTML esegue automaticamente l'escape di tutti gli input dal database e dai parametri di query nei modelli (a meno che non sia specificato diversamente), CSRF controlla per impostazione predefinita, utilizza parametri di query, ecc.

    
risposta data 02.04.2014 - 18:36
fonte
0

Per prevenzione, intendi una correzione del codice, una regola IDP, qualcos'altro? Supponendo la correzione del codice, quindi in quale lingua è scritto, quale framework, ecc?

In generale, ciò che dovresti fare nel codice è ovunque dove i dati (in particolare provenienti dall'input dell'utente) vengono riscritti, che i dati sono opportunamente sfuggiti nel suo contesto (sia esso HTML, URL, JavaScript, ecc.) di dove è stato scritto.

Guardando il tuo vettore di attacco, sembra che la stringa di query inviata sia automaticamente aggiunta ad un tag di ancoraggio generato. In tal caso, la potenziale correzione consiste nell'analizzare correttamente il contesto della stringa di query in un insieme di coppie chiave-valore e quindi serializzare correttamente la raccolta o correttamente uscire da tutti i caratteri che consentono di uscire dal contesto del valore dell'attributo HTML. Detto questo, dipende molto dal contesto di come il codice è scritto, dove, cosa, come, quando, ecc ... Quindi la tua domanda è un po 'vaga per fornire una risposta concreta.

    
risposta data 02.04.2014 - 16:58
fonte

Leggi altre domande sui tag