¿La visualización de imágenes en los perfiles por URL tiene implicaciones de seguridad?

3

Actualmente estoy desarrollando una aplicación web, en la que los usuarios pueden crear un perfil y completar la información del usuario. En esto también he guardado una Sección para la imagen de perfil, en la que he usado una lógica que no debe cargar ningún usuario. Cualquier imagen a la imagen de perfil solo para pruebas y en lugar de eso, estoy mostrando imágenes como <div style="background-image: url("http://example.com/image.jpg")></div>

En este punto, he creado una Entrada para que el usuario coloque la ruta de la imagen jpg desde cualquier sitio que le guste y muestro directamente la imagen de ese sitio, que es http://example.com/image.jpg en nuestro caso.

Quiero considerar la peor situación aquí, no he colocado ningún cheque ni he incluido en la lista blanca ningún dominio en example.com/image.jpg . Coloqué una URL como http://stackoverflow.com/index.html que me muestra en blanco, probé muchos scripts PHP como http://attacker.com/omg.php y no ejecuta el script en mi dominio.

¿Hay alguna posibilidad de vector de ataque aquí? Si es así, por favor sugiéreme. Y también es posible omitir CORS o SOP aquí, tengo protección CSP del dominio.

Nota: en la sección de URL, estoy haciendo la primera verificación de validación en scheme de la URL donde http: //, // y https: // están en lista blanca & en la sección Imagen, SOLO he incluido en la lista blanca Números + Alfabetos y caracteres especiales como . , - & / .El resto está bloqueado

    
pregunta Gerorge Timber 24.06.2016 - 09:34
fuente

2 respuestas

2
  

probé muchos scripts php como http://attacker.com/omg.php y no ejecuta el script en mi dominio ...

El problema aquí no sería una vulnerabilidad del lado del servidor, sino más bien una vulnerabilidad XSS reflexiva que se ejecuta en el navegador y no en el servidor, por lo que el archivo php no funcionó.

Tomado de OWASP ( vea aquí ):

  

La secuencia de comandos reflejada entre sitios (XSS) se produce cuando un atacante inyecta un código ejecutable del navegador dentro de una única respuesta HTTP. El ataque inyectado no se almacena dentro de la propia aplicación; no es persistente y solo afecta a los usuarios que abren un enlace creado de manera malintencionada o una página web de terceros. La cadena de ataque se incluye como parte de los parámetros URI o HTTP diseñados, procesados incorrectamente por la aplicación y devueltos a la víctima.

Si adjunto un archivo (llamémoslo script.html) y ejecuté Javascript allí, cualquiera que vea la "imagen" ejecutará el Javascript en su navegador.

Por ejemplo:

Soy un usuario de su sitio web y adjunto una imagen de perfil con el enlace http://mymalicouswebsite.com/script.html y en el archivo script.html tengo el siguiente código:

...Some HTML...
<script>
    window.onload = function(){
        //Anything I put here will run on any viewers browser
    }
</script>
...Some HTML...

Esto puede ser aún peor, el atacante puede hacer lo siguiente:

  • Reemplaza todo tu código html body con cualquier contenido que desee (puede cargar un iframe , que es una página de phishing)
  • Puede robar cookies a los usuarios y enviarlas a su página utilizando AJAX
  • Redirige al usuario a una unidad en la que se descargará un virus y el usuario pensará que viene de tu sitio web
  

Ahora, ¿hay algún vector de posibilidad de ataque aquí? Si es así, sugiéreme amablemente. Y también es posible omitir CORS o SOP aquí, tengo protección CSP del dominio.

CORS es cuando una solicitud HTTP proviene de un script que no es este el caso. Lo que estás haciendo es como si estuvieras cargando un iframe .

Acerca de CSP : Tendría que ver tu configuración que está configurada para ver si se puede realizar un ataque ...

    
respondido por el Bubble Hacker 24.06.2016 - 10:48
fuente
2

El riesgo no es que una secuencia de comandos como http://attacker.com/omg.php se ejecute en su dominio, es que un usuario logra salir de la

<div style='background-image: url("http://example.com/image.jpg")'></div>

contexto donde se escribe la URL en la página. Tenga en cuenta que el código se ha corregido de su pregunta (comillas simples utilizadas para el atributo HTML para aclarar las cosas).

PHP es del lado del servidor, sin embargo, debido a que está mostrando una imagen del lado del cliente, no hay riesgo del lado del servidor.

Incluso si se ingresó //example.com/evil.js , el script no se ejecutará en el navegador porque se solicita en el contexto de una imagen, no de un script.

De vuelta al problema: para mitigar que el usuario que está tratando de salir del contexto donde se escribe la URL, debe mitigar contra XSS (secuencias de comandos entre sitios) .

Para eso, vea la regla # 4

No hacerlo puede permitir al usuario ingresar algo como

")'><script>alert('xss')</script>

como su URL de imagen que se procesaría

<div style='background-image: url("")'><script>alert('xss')</script>")'></div>

en la página y ejecute el script. Aquí solo se muestra un cuadro de alerta, sin embargo, las vulnerabilidades de XSS se pueden usar para comprometer toda la sesión del usuario.

La regla para hacer esto seguro es la siguiente:

  

A excepción de los caracteres alfanuméricos, escape todos los caracteres con ASCII   valores inferiores a 256 con el formato de escape \ HH.

Esto debe hacerse en la salida a la página.

Como segunda línea de defensa, también puede validar en la entrada que la URL ingresada comienza con http:// , // o https:// y pedirle al usuario que la corrija si no lo hace. Esta sería una comprobación adicional de las URL javascript: , sin embargo, todavía necesita la codificación adecuada para evitar los desgloses de contexto de atributos y CSS.

    
fuente

Lea otras preguntas en las etiquetas