En el artículo al que has vinculado, el código Javascript no se incluye dentro del propio archivo de imagen, sino que se manifiesta dentro de la página HTML que hace referencia a la imagen. Se están devolviendo datos no confiables dentro de la etiqueta de la imagen sin suficiente validación o desinfección. Esto es secuencias de comandos persistentes entre sitios ya que la información maliciosa se devuelve cada vez que alguien ve la página que incluye esta imagen (es decir, probablemente esté almacenada en la base de datos como parte del perfil del usuario).
Convencionalmente, el marcado HTML para incluir una imagen de perfil podría tener este aspecto:
<img src="/imagename.jpg">
Sin embargo, tiene que ser diferente para cada usuario, por lo que el código de la aplicación que lo genera podría tener este aspecto (por ejemplo, PHP):
<img src="/<?=$imagename?>">
Entonces, si el usuario Alice cargó alicespic.jpg
, los usuarios verán esa imagen cuando visiten su perfil, por ejemplo. Sin embargo, aquí es donde puede producirse la vulnerabilidad, si el nombre de la imagen no está correctamente validado o saneado.
Por ejemplo, si Mallory pudiera establecer el nombre de la imagen de su perfil en inncoent.jpg" onload="alert(1)
, se generaría el siguiente marcado HTML:
<img src="/inncoent.jpg" onload="alert(1)">
Utilizar el evento onload significa que el script arbitrario se ejecutará una vez que la imagen haya terminado de cargarse. Básicamente, este código Javascript se ejecutará cada vez que alguien vea el perfil afectado, pero se ejecutará dentro de su navegador.
Esto no ocurriría si el desarrollador solo permitiera que se incluyeran caracteres seguros dentro del nombre de la imagen.