Se un sito Web esclude i termini relativi a XSS, è ancora potenzialmente vulnerabile?

1

Ad esempio, supponiamo che esista un sito Web in cui l'input dell'utente non è correttamente disinfettato, ma questi filtri sono ancora attivi. Qualsiasi cosa digitata viene inserita tra due tag div.

Se l'input è " hello ", viene visualizzato nell'origine come " <div>hello</div> "

Anche i tag

funzionano. Se l'input è " <!-- ", si trasformerà in " <div><!--</div> ", trasformando gran parte dell'HTML nella pagina in un commento, interrompendone una parte.

Tuttavia, i tag dello script sono filtrati. Inserendo " <script>alert('xss')</script> " restituirai " <div>alert('xss')</div> ", ovviamente non eseguendo alcun javascript.

"javascript:" viene filtrato e trasformato in "nojavascript" se usato come sorgente.

ingresso:

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

uscita:

<img src=nojavascript...alert('hi'); />

Un'altra parte del filtro la protegge da " onload= " e altri attacchi XSS basati su eventi HTML. Se " onload=alert('xss') " è l'input, non verrà visualizzato affatto nella sorgente.

Quindi, la mia domanda è: questo sito web sarebbe ancora vulnerabile allo scripting cross-site, o è sicuro a causa del filtro che usa?

    
posta Zachary Swanson 16.05.2017 - 00:28
fonte

1 risposta

9

So, my question is, would this website still be vulnerable to cross-site scripting, or is it safe due to the filter it uses?

Non è sicuro. Non hai descritto completamente il meccanismo di filtraggio, ma è garantito che un filtro XSS basato su lista nera lasci alcune lacune.

Esempi

Considerate l'attributo href dei tag di collegamento? Un clic su questo link si innescherebbe:

<a href="javascript:alert(1)">Click me<a>

Se filtra javascript: , i tuoi controlli non fanno distinzione tra maiuscole e minuscole?

<a href="JaVaScRiPt:alert(1)">Click me<a>

E consideri diversi modi di codifica? Per esempio:.

<a href="javascript&#x3a;alert(1)">Click me</a>

Considerate i frame? Non è certamente sufficiente filtrare javascript: in quanto un utente malintenzionato potrebbe utilizzare anche altri schemi, ad esempio:

<iframe src="data:text/html,<script>alert(1)</script>">

Se stai pensando che il tag <script> all'interno del frame src verrà rilevato dal filtro, può ovviamente essere codificato, ad esempio:

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">

Inoltre, ritieni che <iframe> abbia un attributo srcdoc ?

<iframe srcdoc="<script>alert(1)</script>">

Ancora una volta, ci sono molti modi per codificarlo, ad esempio:

<iframe srcdoc="&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;">

L'elenco potrebbe continuare. (Che dire SVG, moduli, meta tag, protocolli oscuri specifici del fornitore, applet flash incorporati, CSS, ...?)

L'approccio corretto consiste nell'utilizzare una whitelist di tag e attributi consentiti e analizzare l'albero DOM risultante anziché le sostituzioni di stringa basate su espressioni regolari.

    
risposta data 16.05.2017 - 02:27
fonte

Leggi altre domande sui tag