Sta convertendo '' in '<' sufficiente per impedire l'esecuzione di JavaScript da HTML arbitrario?

6

Questa è una specie di domanda bar-scommessa. Un mio conoscente ha affermato che, dato un arbitrario glob di HTML, può essere completamente impedito di eseguire JavaScript se, prima di schiacciarlo in una pagina Web, si sostituiscono tutte le istanze di < con &lt; - e non apportare altre modifiche.

Non sono convinto che la mia conoscenza sia corretta, ma non posso nemmeno pensare a un controesempio. Qualcuno può provare o confutare?

Chiarimento: supponiamo che l'escape avvenga sul lato server e che il glob sia inserito come il contenuto di un elemento normale, ad es.

<p>{{ GLOB GOES HERE }}</p>

Inoltre, supponiamo che un client che implementa l'algoritmo del parser HTML5, correttamente; non siamo preoccupati per bug, parser legacy o scenari che si applicano solo in XML o SGML.

Ulteriore chiarimento: le regole OWASP sono deliberatamente prudenti. Perché questa è una scommessa da bar, vogliamo una risposta pedantica , non una risposta conservativa.

    
posta zwol 26.11.2014 - 03:45
fonte

5 risposte

6

All'interno dell'elemento, la modalità di analisi si trova nello stato dei dati. Gli unici caratteri speciali che possono sfuggire allo stato dei dati sono < e & ( link sec .8.2.4.1).

Se sostituisci tutte le istanze di < con &lt; , devi preoccuparti solo di & .

In HTML4 e XML, è necessario considerare quali riferimenti all'entità sono disponibili per la sostituzione e se alcuni di essi potrebbero essere utilizzati per iniettare uno script o un altro vettore di attacco. Questo potrebbe essere un problema, ad esempio, se il markup si riferisce a un DTD esterno e l'utente malintenzionato può reindirizzare un download di rete del DTD esterno a uno di loro scelta. Questo è uno dei motivi per cui molti parser XML e HTML non vanno in rete per risolvere gli identificatori di sistema.

Tuttavia, HTML5 consente di utilizzare solo & per le entità carattere, nessuna delle quali può essere utilizzata per uscire dalla modalità dati.

Quindi, in assenza di bug nel parser e nel markup, la tua conoscenza è corretta.

    
risposta data 30.11.2014 - 09:07
fonte
5

Dipende da dove all'interno del documento HTML i dati vengono stampati in quanto vi sono diversi contesti all'interno di regole diverse . La sostituzione di un valore letterale < di &lt; è possibile solo quando < è un carattere speciale, che cambierebbe lo stato di analisi corrente.

C'è una rapida panoramica delle regole di prevenzione in XSS (Cross Site Scripting) di OWASP Prevention Cheat Sheet , che dovrebbe darti un suggerimento su ciò di cui dovresti essere a conoscenza.

    
risposta data 26.11.2014 - 08:36
fonte
4

Dipende da molti fattori.

Se l'input dannoso (l'input di tutti gli utenti è malevolo per impostazione predefinita) viene riprodotto solo nel corpo HTML e il server invia le intestazioni "Content-Type: text / html; charset = utf-8" e "X-Content- Type-Options: nosniff ", la risposta è sì, questo metodo è abbastanza sicuro.

Quando dico HTML body, suppongo che tu stia echeggiando l'input a <html><body>INPUT_HERE</body></html>.

Se si esegue semplicemente l'eco dell'ingresso su una pagina vuota, senza alcuni byte prima dell'input, è possibile utilizzare l'attacco Rosetta Flash.

    
risposta data 26.11.2014 - 03:49
fonte
3

Questa è una pessima pratica. Stai mantenendo una lista nera. Ma il modo consigliato è mantenere una whitelist che fornisce solo i caratteri consentiti dopo un filtro.

La risposta alla tua domanda è, < può essere codificata esadecimale e scrivere in altri schemi codificati. Quindi semplicemente sostituire < con &lt; non sarebbe adeguato.

    
risposta data 26.11.2014 - 06:28
fonte
1

Dove stai analizzando il < ? Se è sul client, allora hai solo forse fermato un hacker di dieci anni ( ma non questo hacker di dieci anni ).

Tuttavia, se stai analizzando il codice eseguibile lato server, allora sì, hai effettivamente fermato questa particolare forma di iniezione, anche se ci sono modi più completi e sicuri per farlo.

Forse mi manca l'essenza della tua domanda quindi se stai semplicemente chiedendo se è possibile sostituire tutte le istanze di < con (qualsiasi altra cosa), allora la risposta è sì. Sì, per impostazione predefinita, questo impedirà l'analisi e l'esecuzione di tutti i tag javascript perché l'entità carattere &lt; non viene elaborata quando viene caricato il DOM.

Ecco un riferimento per realizzare ciò che potresti chiedere. Ho lasciato il mio primo bit perché è ancora importante.

    
risposta data 26.11.2014 - 04:30
fonte

Leggi altre domande sui tag