Cross-Site Scripting, ampiamente noto come XSS, è uno dei metodi di attacco più pericolosi utilizzati da criminali informatici, quindi è fondamentale che ogni sviluppatore e ricercatore di sicurezza sappia cos'è e come farlo prevenire gli attacchi. Quindi, come puoi agire contro la vulnerabilità XSS? Usi HTML, JavaScript o DOM per mostrare i dati che un sito web riceve dall'utente. Una o più di queste tre diverse aree possono lavorare insieme.
Come prevenire XSS utilizzando HTML
XSS consente agli aggressori di iniettare codici dannosi o script in pagine Web, prendendo di mira utenti ignari che visitano il sito. Ciò potrebbe rubare dati personali, reindirizzare i visitatori a un altro sito creato dal criminale informatico o alterare in altro modo l'aspetto della pagina web. Ma puoi impedire che ciò accada; ad esempio, impedendo loro di inserire HTML.
Immagina di avere un sito web con un libro degli ospiti. Supponiamo che i tuoi visitatori che utilizzano questo libro degli ospiti possano scrivere qui i loro nomi e messaggi e che i loro messaggi possano essere visualizzati pubblicamente. Un utente malintenzionato che desidera eseguire un test XSS nel tuo libro degli ospiti utilizzerà l'area che hai assegnato per scrivere un messaggio. Quel criminale informatico eseguirà un codice JavaScript qui. Ad esempio, un utente malintenzionato potrebbe utilizzare codice JavaScript come:
<copione>mettere in guardia("L'XSS!")</script>
L'attaccante deve utilizzare un tag di script affinché ciò abbia successo. In caso contrario, il codice JavaScript non funzionerà. È necessario codificare l'istruzione < in modo che gli utenti non possano mai utilizzare i tag HTML. Ciò renderà difficile per l'attaccante lavorare con i tag HTML.
Come prevenire XSS utilizzando JavaScript
Anche la logica in HTML lo è valido in JavaScript. In alcune applicazioni è possibile stampare i dati ricevuti dal sito web dall'utente con un codice JavaScript.
Considera questa codifica:
<id p="stampa"></P>
<copione>
documento.getElementById("test").innerHTML = "";
</script>
Immagina che un sito Web utilizzi un blocco di codice come quello sopra. Lo sviluppatore ha utilizzato un tag "p" chiamato "print" qui. Come puoi vedere dal codice, un valore verrà dal parametro "cerca" e lo sviluppatore vuole mostrare questo valore in entrata nel tag "p". Lo sviluppatore che ha effettuato questa operazione voleva utilizzare la funzionalità innerHTML di JavaScript.
Ora diamo un'occhiata alla situazione dal punto di vista dell'attaccante informatico. In tal caso, l'attaccante eseguirà un test XSS all'interno del tag "script". Per questo, l'attaccante non ha bisogno di riavviare il tag, perché è già in uso un tag "script". L'attaccante potrebbe quindi scrivere un test come questo:
nomefile.php? ricerca=a" mettere in guardia("L'XSS!"); f= "
Questo codice apparirà sul sito web come:
documento.getElementById("test").innerHTML = " UN" mettere in guardia("L'XSS!"); f="";
Quell'attacco avrebbe avuto successo. Per comprendere meglio il problema, esaminiamo un'altra tecnica di esempio che un utente malintenzionato potrebbe utilizzare. L'hacker potrebbe aver applicato un test XSS come:
nomefile.php? ricerca=";</script><em>Fatih</em>
Ecco come apparirebbe se visto dal sito web:
documento.getElementById("test").innerHTML = "";</script><em>Fatih</em>";
Questo può sembrare un po' strano perché l'attaccante ha chiuso il primo tag "script" usando una struttura come "/script" qui. E così, l'attaccante può riavviare qualsiasi codice JavaScript e HTML che desidera.
Se pensi a questi due diversi esempi, proteggere da XSS sembra piuttosto semplice. La precauzione necessaria sarebbe quella di codificare il file " E ' caratteri che vedi nel primo esempio. Nel secondo esempio, codifica i caratteri < E >.
Come impedire XSS utilizzando DOM
In questa variante di XSS, i dati che il sito web riceve dall'utente possono interferire con la proprietà di un elemento DOM. Ad esempio, le informazioni sul colore che il sito riceve dall'utente possono influenzare il colore di sfondo di una tabella o l'intero sfondo della pagina. Quindi l'utente interferisce inconsapevolmente con i layout di stile del corpo e della tabella. Il seguente codice è un buon esempio per questo:
<corpo bgcolor="<?php echo $_GET['colore']; ?>"/>
Con questo, il sito utilizza il parametro "color" ricevuto dall'utente direttamente nella proprietà "bgcolor" dell'elemento "body". Quindi cosa potrebbe fare un attaccante a questo punto? Potrebbero eseguire questo codice dannoso:
nomefile.php? colore=rosso" carico="mettere in guardia('L'XSS!')
Questo appare così se visto dal sito web:
<corpo bgcolor=" rosso" carico="mettere in guardia('L'XSS!') "/>
Per evitare che ciò accada, lo sviluppatore dovrebbe codificare il file " carattere.
Tuttavia, c'è un altro elemento importante in JavaScript da notare. Il seguente frammento di codice ne è un esempio:
<a href="javascript: avviso('L'XSS!')">
Ciò significa che è possibile eseguire direttamente del codice JavaScript. Una delle migliori misure preventive è assicurarsi che il sito Web controlli se i dati che riceve dagli utenti sono un URL reale. Il metodo più semplice è assicurarsi che esistano espressioni come "HTTP" e "HTTPS" (la versione sicura di HTTP) nella connessione.
Una funzione di esempio per prevenire XSS con PHP
Hai visto alcuni esempi di come proteggere un'app o un sito Web dagli attacchi XSS. Puoi utilizzare i frammenti di codice in questa tabella con PHP:
Codifica in HTML |
htmlspecialchars($str, ENT_COMPAT) |
Codifica in JavaScript e attributo DOM |
htmlspecialchars($str, ENT_NOQUOTES) |
Controllo dell'URL |
'/^(((https?)|(\/\/))).*/'; |
Tieni presente che questi sono solo esempi e variano a seconda della lingua del software che stai utilizzando.
Puoi creare un'applicazione web con PHP e prova i codici che vedi sopra per scriverli. Se ti stai chiedendo come utilizzare tutti questi metodi, puoi ottenere alcune idee dal blocco di codice PHP di seguito, che dovrebbe essere utile anche se stai utilizzando una lingua diversa:
<?php
$dati = $_GET['dati'];funzionein_attributo($str){
ritorno htmlspecialchars($str, ENT_COMPAT);
// ENT_COMPAT codificherà il carattere di doppia virgoletta (").
}
funzionein_html($str){
$ collegamento = '/^(((https?)|(\/\/))).*/';
Se(!preg_match($link, $str))
{
ritorno "/";
}
ritorno $str;
}
$dati = in_attributo($dati);
$dati = in_html($dati);
$dati = real_url (dati);
?>
Proteggi il tuo sito web da XSS e altro
XSS è un popolare vettore di attacco utilizzato dagli hacker. Di solito, un valore di percorso nell'URL, qualsiasi campo del tuo sito Web in cui è possibile inserire dati (come moduli e campi di commenti), può essere utilizzato per testare una vulnerabilità XSS. Ma, naturalmente, ci sono molti metodi diversi che i cybercriminali possono utilizzare per attaccare un sito, soprattutto se si dispone di un sito Web che ha molti utenti e nasconde le loro informazioni.