Come Anders dice: Blender fa un ottimo punto sulle finestre di autenticazione, e korockinout13 ha ragione su gli attributi on. Inoltre, gli Aders aggiungono discussioni sul tag a e Matija hanno un buon link sullo sfruttamento delle librerie che fanno il rendering.
Eppure, nessuno ha ancora parlato di SVG.
Prima di tutto supponiamo che tutti gli input e gli output siano correttamente sterilizzati, quindi i trucchi con onerror / onload non sono possibili. E che non siamo interessati a CSRF. Siamo dopo XSS.
La prima preoccupazione per <img src= è che non segue la stessa politica di origine. Ma probabilmente è meno pericoloso di quanto sembri.
Che cosa fa il browser per eseguire il rendering di < img > tag
< img src="http://domain/image.png">èabbastanzasicuroperchéilbrowsernoninvocheràunparser(adesempiounparserXMLoHTML),sacheciòcheverràèun'immagine(gif,jpeg,png).
IlbrowsereseguiràlarichiestaHTTPeleggeràsemplicementeilMIMEdiciòcheèvenuto(nell'intestazioneConetent-Type,adesempioimage/png).SelarispostanonhaunContent-Typediversibrowserindovinerannoinbaseall'estensione,etuttaviasupporterannosoloimmaginiMIME:image/jpeg,image/pngoimage/gif(tiff,bmpeppmsonodubbi,alcunibrowserpotrebberoavereunsupportolimitatoperindovinarle).Alcunibrowserpotrebberopersinotentarediindovinareilformatodell'immaginebasatosunumerimagici,madinuovononcercherannodiindovinareiformatiesoterici.
SeilbrowserpuòcorrisponderealMIME(probabilmenteindovinato)caricalalibreriadirenderingcorretta,lelibreriedirenderingpotrebberoavereunoverflowmaquestaèun'altrastoria.SeilMIMEnoncorrispondeaunalibreriadirenderingdiimmagini,l'immaginevienescartata.Selachiamataallalibreriadirenderingfallisce,anchel'immaginevienescartata.
Ilbrowsernonèmainemmenovicinoauncontestodiesecuzione(script).Lamaggiorpartedeibrowseraccedonoalcontestodiesecuzionesolodalparserjavascriptepossonosoloraggiungereilparserjavascriptdalapplication/javascriptMIMEodaiparserXMLoHTML(poichépotrebberoaverescriptincorporati).
PereseguireXSSabbiamobisognodiuncontestodiesecuzione.EntrainSVG.
Usodi<imgsrc="dominio / blah / blah / tricky.svg" >
Ahi, ahi ahi. SVG è un formato grafico vettoriale basato su XML, pertanto richiama il parser XML nel browser. Inoltre SVG ha il tag <script> ! Sì, puoi incorporare javascript direttamente in SVG.
Questo non è così pericoloso come sembra all'inizio. I browser che supportano SVG all'interno dei tag <img> non supportano lo scripting all'interno del contesto . Idealmente dovresti usare SVG all'interno di <embed> o <object> tag dove lo scripting è supportato dai browser. Eppure, non farlo per i contenuti forniti dagli utenti!
Direi che consentire a SVG all'interno di <img src= può essere pericoloso:
-
Un parser XML viene utilizzato per analizzare SVG, sia che si trovi all'interno del tag <img> o <object> . Il parser è certamente ottimizzato con alcuni parametri per ignorare i tag <script> nel contesto <img> . Eppure, è abbastanza brutto, è mettere in blacklist un tag in un certo contesto. E la lista nera è scarsa sicurezza.
-
<script> non è l'unico modo per ottenere il contesto di esecuzione in SVG, ci sono anche gli eventi onmouseover (e famiglia) presenti in SVG. Questo è di nuovo difficile da inserire nella blacklist.
-
Il parser XML nei browser ha sofferto di problemi in passato, notevoli con i commenti XML attorno ai blocchi di script. SVG potrebbe presentare problemi simili.
-
SVG ha pieno supporto per gli spazi dei nomi XML. Ahi di nuovo. xlink:href è un costrutto completamente valido in SVG e il browser all'interno del contesto del parser XML probabilmente lo seguirà.
Quindi sì, SVG apre diversi vettori possibili per raggiungere il contesto di esecuzione. Inoltre, è una tecnologia relativamente nuova e quindi non ben temprata. Non sarei sorpreso di vedere CVE sulla gestione SVG. Ad esempio ImageMagick ha avuto problemi con SVG .