XSS o Cross-Site Scripting es una vulnerabilidad de aplicación web que permite a un atacante inyectar contenido JavaScript vulnerable en un sitio web. Un atacante aprovecha esto al inyectar en sitios web que no desinfectan o desinfectan pobremente el contenido controlado por el usuario. Al inyectar contenido vulnerable que un usuario puede realizar (pero no limitado a),
- Robo de galletas.
- Desfigurar un sitio web.
- Omitir la protección CSRF, etc.,
Hay varias formas en que una aplicación web puede protegerse de los problemas de Cross-Site Scripting. Algunos de ellos incluyen,
- Filtrado de listas negras.
- Filtrado de listas blancas.
- Codificación Contextual.
- Validación de entrada.
- Política de seguridad de contenido.
1. Filtrado de listas negras
Es fácil implementar una técnica de filtrado que proteja el sitio web de problemas de XSS solo parcialmente. Funciona en base a una lista conocida de vectores XSS finitos. Por ejemplo, la mayoría de los vectores XSS usan atributos de detectores de eventos como onerror , onmouseover , onkeypress etc. Con este hecho, los usuarios que reciben atributos HTML pueden analizarse y estos atributos de detectores de eventos. Esto mitigará un conjunto finito de vectores XSS como <img src=x onerror=alert()>.
Para vectores como <a href=”javascript:alert()”>XSS</a>, se pueden eliminar los esquemas javascript:, data:, vbscript: del HTML proporcionado por el usuario.
ventajas:
- Estos filtros son fáciles de implementar en una aplicación web.
- Riesgo casi nulo de que estos filtros filtren falsos positivos de contenido de usuario seguro
Desventajas:
Pero este filtrado se puede omitir fácilmente ya que los vectores XSS no son finitos y no se pueden mantener así. Aquí está la lista de algunas omisiones válidas de este filtro. Este filtrado no protege completamente el sitio web.
- <a href=”jAvAscRipt:alerta()”>XSS</a>
- <a href=”jAvAs cRipt:alerta()”>XSS</a>
- <a href=”jAvAscRipt:prompt()”>XSS</a>
2. Filtrado de lista blanca
El filtrado de listas blancas es lo opuesto al filtrado basado en listas negras. En lugar de enumerar los atributos inseguros y desinfectar el HTML del usuario con esta lista, el filtrado de listas blancas enumera un conjunto de etiquetas y atributos HTML establecidos. Las entidades que se sabe que son seguras se mantienen y todo lo demás se filtrará.
Esto reduce las posibilidades de XSS al máximo y abre XSS solo cuando hay una laguna en el filtro que trata a algunas entidades inseguras como seguras. Este filtrado se puede realizar tanto en el lado del cliente como en el del servidor. El filtrado de listas blancas es el filtro más utilizado en las aplicaciones web modernas.
ventajas:
- Reduce las posibilidades de XSS en gran medida.
- Algunos filtros de lista blanca, como el filtro Antisamy, reescriben el contenido del usuario con reglas seguras. Esto provoca la reescritura del contenido HTML con estrictos estándares del lenguaje HTML.
Desventajas:
Más a menudo, esto funciona al aceptar HTML inseguro o no desinfectado, los analiza y construye un HTML seguro y responde al usuario. Esto es intensivo en rendimiento. El uso de estos filtros puede tener un impacto oculto en el rendimiento de su aplicación web moderna.
3. Codificación contextual
La otra técnica común de mitigación es considerar todos los datos proporcionados por el usuario como datos textuales y no como contenido HTML, incluso si se trata de contenido HTML. Esto se puede hacer mediante la codificación de entidades HTML en los datos del usuario. La codificación <h1>test</h1> puede convertirse en <pre><test> prueba </></pre> El navegador analizará esto correctamente y representará <h1>prueba</h1> como texto en lugar de representarlo como una etiqueta h1 HTML.
ventajas :
Si se hace correctamente, la codificación contextual elimina completamente el riesgo de XSS.
Desventajas:
Trata todos los datos del usuario como inseguros. Por lo tanto, independientemente de que los datos del usuario sean seguros o no, todo el contenido HTML se codificará y se representará como texto sin formato.
4. Validación de entrada
En la técnica de validación de entrada, se aplica una expresión regular para cada dato de parámetro de solicitud, es decir, contenido generado por el usuario. Solo si el contenido pasa a través de una expresión regular segura, se permite. De lo contrario, la solicitud fallará en el lado del servidor con el código de respuesta 400.
ventajas:
La validación de entrada no solo reduce XSS, sino que protege casi todas las vulnerabilidades que pueden surgir debido a la confianza en el contenido del usuario.
Desventajas:
- Podría ser posible mitigar un XSS en el campo de número de teléfono al tener una validación de expresión regular numérica, pero para un campo de nombre, podría no ser posible ya que los nombres pueden estar en varios idiomas y pueden tener caracteres que no sean ASCII en alfabetos griegos o latinos. .
- Las pruebas de expresiones regulares son intensivas en rendimiento. Todos los parámetros en todas las requests a un servidor deben coincidir con una expresión regular.
5. Política de seguridad del contenido
El navegador moderno permite el uso de CSP o encabezados de política de seguridad de contenido. Con estos encabezados, se puede especificar una lista de dominios solo desde los cuales se puede cargar contenido de JavaScript. Si el usuario intenta agregar un JavaScript vulnerable, los encabezados de CSP bloquearán la solicitud.
ventajas:
CSP es la forma más avanzada de mecanismo de protección XSS. Elimina fuentes no confiables para ingresar datos a sitios web en cualquier forma.
Desventajas:
Para tener encabezados CSP definidos, los sitios web no deben usar código JavaScript en línea. JS debe externalizarse y mencionarse en etiquetas de secuencias de comandos. Este conjunto de dominios que carga contenido estático debe incluirse en la lista blanca en los encabezados de CSP.
Codificación Vs Filtrado –
Una pregunta común sobre la mitigación de XSS es decidir si codificar o filtrar (desinfectar) los datos del usuario. Cuando el contenido dirigido por el usuario se debe representar como HTML pero si no se debe ejecutar javascript, el contenido debe pasar por un filtro. Si los datos del usuario no necesitan representarse como HTML y si la representación textual sería suficiente, se recomienda codificar caracteres HTML en los datos del usuario.
Técnica de mitigación recomendada para XSS:
El filtro de lista negra ha sido explotado varias veces y, debido al contenido HTML en constante crecimiento, siempre es inseguro usar el filtro de lista negra. Aunque la validación de entrada adecuada y los encabezados de CSP pueden mitigar XSS en gran medida, siempre se recomienda codificar o filtrar la entidad según la política de lista blanca según el caso de uso. La validación de entrada y los encabezados CSP se pueden agregar como una capa adicional de protección.
Referencia: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP