Al igual que Anders dice: Blender hace un muy buen punto acerca de los diálogos de autenticación, y korockinout13 es justo acerca de los atributos on. Además, Aders agrega argumentos sobre la etiqueta a
y Matija tiene un buen enlace sobre la explotación de bibliotecas que realizan el representación.
Sin embargo, nadie ha hablado de SVG todavía.
En primer lugar, supongamos que todas las entradas y salidas están correctamente saneadas, por lo que los trucos con onerror
/ onload
no son posibles. Y que no estamos interesados en CSRF. Estamos tras XSS.
La primera preocupación sobre <img src=
es que no sigue la misma política de origen. Pero eso es probablemente menos peligroso de lo que parece.
Lo que hace el navegador para representar un < img > etiqueta
< img src="http://domain/image.png">
esbastanteseguroporqueelnavegadornoinvocaráunanalizador(porejemplo,unanalizadorXMLoHTML),sabequeloquevendráesunaimagen(gif,jpeg,png).
ElnavegadorrealizarálasolicitudHTTPysimplementeleeráelMIMEdeloquevino(enelencabezadoConetent-Type
,porejemplo,image/png
).SilarespuestanotieneunContent-Type
,variosnavegadoresadivinaránsegúnlaextensión,perosoloadivinaránlosMIMEdeimagen:image/jpeg
,image/png
oimage/gif
(tiff,bmpyppmsondudosos,algunosnavegadorespuedentenerunsoportelimitadoparaadivinarlos).Algunosnavegadorespuedeninclusointentaradivinarelformatodelaimagenbasándoseennúmerosmágicos,perotampocointentaránadivinarlosformatosesotéricos.
SielnavegadorpuedecoincidirconelMIME(posiblementeadivinado),cargalabibliotecaderepresentacióncorrecta,lasbibliotecasderepresentaciónpuedentenerundesbordamiento,peroesaesotrahistoria.SielMIMEnocoincideconunabibliotecaderepresentacióndeimágenes,laimagensedescarta.Silallamadadelabibliotecaderenderizadofalla,laimagentambiénsedescarta.
Elnavegadornuncaestánisiquieracercadeuncontextodeejecución(script).Lamayoríadelosnavegadoresingresanenelcontextodeejecuciónsolodesdeelanalizadordejavascript,ysolopuedenalcanzarelanalizadordejavascriptdesdeelapplication/javascript
MIMEodesdelosanalizadoresdeXMLoHTML(yaquepuedentenerscriptsincrustados).
PararealizarXSSnecesitamosuncontextodeejecución.EntraenSVG.
Usando<imgsrc="dominio / blah / blah / tricky.svg" >
Auch, ay, ay. SVG es un formato de gráfico vectorial basado en XML, por lo que invoca el analizador XML en el navegador. Además, SVG tiene la etiqueta <script>
! Sí, puedes incrustar javascript directamente en SVG.
Esto no es tan peligroso como parece al principio. Los navegadores que admiten SVG en las etiquetas <img>
no admiten las secuencias de comandos en el contexto . Lo ideal sería utilizar SVG dentro de las etiquetas <embed>
o <object>
donde los navegadores admiten las secuencias de comandos. Sin embargo, ¡no lo hagas por el contenido proporcionado por el usuario!
Argumentaría que permitir SVG dentro de <img src=
puede ser peligroso:
-
Se usa un analizador XML para analizar el SVG, ya sea que esté dentro de la etiqueta <img>
o <object>
. El analizador ciertamente está ajustado con algunos parámetros para ignorar las etiquetas <script>
en el contexto <img>
. Sin embargo, eso es bastante feo, es poner una etiqueta en una lista negra en un contexto determinado. Y las listas negras son una seguridad deficiente.
-
<script>
no es la única forma de lograr un contexto de ejecución en SVG, también hay los eventos onmouseover
(y familia) presentes en SVG. Esto es nuevamente difícil de poner en la lista negra.
-
El analizador XML en los navegadores sufrió problemas en el pasado, notables con los comentarios XML en torno a los bloques de script. SVG puede presentar problemas similares.
-
SVG tiene soporte completo para espacios de nombres XML. Ay otra vez. xlink:href
es una construcción completamente válida en SVG y el navegador dentro del contexto del analizador XML probablemente lo seguirá.
Por lo tanto, sí, SVG abre varios vectores posibles para lograr un contexto de ejecución. Y, además, es una tecnología relativamente nueva y, por lo tanto, no está bien endurecida. No me sorprendería ver CVEs en el manejo de SVG. Por ejemplo, ImageMagick tuvo problemas con SVG .