¿Cómo me protejo contra los ataques XSS en atributos como src?

c# html-agility-pack security xss

Pregunta

Así que he estado construyendo un desinfectante html C # usando agilidad html con una lista blanca. Funciona bien, excepto en casos como estos:

<img src="javascript:alert('BadStuff');" />
<img src="jav&#x09;ascript:alert('BadStuff');"> 

Yo QUIERO permitir el atributo src, simplemente no cosas maliciosas dentro de él obviamente. Todo lo que he buscado acaba de recomendar una lista blanca para las etiquetas y sus atributos. ¿Cómo manejarías algo como esto? Sé que esto no funcionará en ningún navegador nuevo, pero no estoy muy familiarizado con la seguridad y estoy seguro de que hay otras cosas inteligentes que los atacantes podrían hacer.

Respuesta aceptada

Los ataques de scripts entre sitios (XSS) explotan vulnerabilidades en la validación de páginas web al inyectar un código de script del lado del cliente. Las vulnerabilidades comunes que hacen que sus aplicaciones web sean susceptibles de ataques de secuencias de comandos entre sitios incluyen no poder validar correctamente la entrada, no codificar la salida y confiar en los datos recuperados de una base de datos compartida. Para proteger su aplicación contra ataques de scripts entre sitios, suponga que todas las entradas son maliciosas. Restrinja y valide todas las entradas. Codifique todos los resultados que podrían, potencialmente, incluir caracteres HTML. Esto incluye datos leídos de archivos y bases de datos.

Uno de los ejemplos más graves de un ataque de secuencias de comandos entre sitios ocurre cuando un atacante escribe una secuencia de comandos para recuperar la cookie de autenticación que proporciona acceso a un sitio de confianza y luego publica la cookie en una dirección web conocida por el atacante. Esto permite al atacante falsificar la identidad del usuario legítimo y obtener acceso ilícito al sitio web.

Las vulnerabilidades comunes que hacen que su aplicación web sea susceptible a ataques de scripts entre sitios incluyen:

  • No se puede restringir y validar la entrada.
  • No poder codificar la salida.
  • Confiando en los datos recuperados de una base de datos compartida.

Pautas

Las dos contramedidas más importantes para evitar ataques de secuencias de comandos entre sitios son:

  • Restricción de entrada.
  • Codificar la salida.

Resumen de pasos

Para evitar las secuencias de comandos entre sitios, realice los siguientes pasos:

Paso 1. Verificar que la validación de solicitud ASP.NET esté habilitada.

Paso 2. Revise el código ASP.NET que genera la salida HTML.

Paso 3. Determine si la salida HTML incluye parámetros de entrada.

Paso 4 . Revise las etiquetas y atributos HTML potencialmente peligrosos.

Paso 5 Evaluar contramedidas.

Para más detalles ver la 2da referencia.

Referencias:

Explicación de las secuencias de comandos entre sitios: cómo evitar los ataques XSS

Cómo: Prevenir las secuencias de comandos entre sitios en ASP.NET


Respuesta popular

Puede permitir el atributo src de forma segura, siempre que desinfecte y maneje la entrada correctamente. Para hacer esto, primero debe desinfectarlo a través de una lista blanca de caracteres de URL válidos, canonicalizarlo y luego verificar que apunta a una imagen válida.

La lista blanca que mencionó es el primer paso (y uno importante en eso). Para implementar la lista blanca, simplemente elimine todos los caracteres que no sean válidos para una URL. También verifique que la URL esté formada correctamente, lo que significa que apunta a un recurso válido al que el usuario debería poder acceder. Por ejemplo, el usuario no debería acceder a un archivo local en el servidor al pasar el file://sensitive.txt o algo así. Si http o https son los únicos protocolos que deben usarse, verifique que la URL comience con esos. Si eres un paranoico adicional, puedes rechazar la solicitud por completo, ya que es obvio que ha sido manipulado. La lista blanca es importante, pero la lista blanca por sí sola no mantendrá la característica segura.

La canonización es importante porque muchos ataques dependen del envío de URL que eventualmente lo llevan a un lugar determinado, pero pueden abusar de la innata falta de razonamiento de la computadora para llegar a cosas que no deberían. Esto también ayudará a eliminar rutas duplicadas al mismo recurso que puede mejorar el rendimiento (o al menos le permitirá mejorar el rendimiento al no volver a verificar un archivo conocido que no haya cambiado desde la última vez que lo verificó. Tenga cuidado con esto, porque es posible falsificar una fecha de última modificación, por lo que un atacante podría intercambiar un archivo malicioso después de haberlo "comprobado y confiado".

Para verificar que está apuntando a una imagen válida, abra el archivo y lea los primeros bytes. No se limite a confiar en la extensión del archivo, aunque se echa en primer lugar antes de abrir el archivo (para el rendimiento y la seguridad). Cada formato de imagen tiene un cierto patrón de bytes que puede verificar. Una buena a primera vista es JPEG . Es posible que un usuario malintencionado aún pueda colocar shellcode u otro código de ataque en un archivo de imagen que contenga los encabezados adecuados, pero es mucho más difícil hacerlo. Esto será un cuello de botella en el rendimiento, así que planifique adecuadamente si implementa esto.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué