Seguridad de aplicaciones web - Vulnerabilidad XSS
Lukasz Kolko
Los ataques XSS permiten a los atacantes inyectar scripts del lado del cliente en páginas web vistas por otros usuarios. Los principales efectos de esta vulnerabilidad son la posibilidad de ejecutar cualquier acción en el contexto del usuario conectado, y de leer cualquier dato en el contexto del usuario conectado.
Escenario de ataque
El atacante localiza la vulnerabilidad XSS en un sitio web utilizado por la víctima, por ejemplo, el sitio web de un banco
La víctima está actualmente conectada a esta página
El atacante envía a la víctima una URL manipulada
La víctima hace clic en la URL
En la víctima banco sitio web, JavaScriptcódigo comienza a ejecutarse para interceptar los datos del usuario o ejecutar una transferencia en su nombre a la cuenta del atacante
Cabe señalar que las operaciones realizadas en nombre de la víctima pueden ser invisibles para ella, ya que pueden tener lugar en segundo plano utilizando la API del banco, o el atacante puede realizarlas posteriormente con los datos necesarios para la autenticación, tokens, cookies, etc.
Tipos de XSS
1. XSS reflejado
Es aquel en el que el código HTML/JavaScript contenido en cualquier parámetro (por ejemplo, GET, POST o cookie) se muestra en respuesta.
Una página con una entrada de texto para buscar algo que pone el parámetro ?search=foo en la terminación de la URL al consultar la API. Después de introducir cualquier frase, si no se encuentra, se coloca un mensaje de retorno en HTML ex.
<div>No se ha encontrado ningún resultado para <b>foo</b></div>
Podemos intentar poner la URL ?search=..
2.DOM XSS
Esto ocurre cuando se habilita su ejecución mediante el uso de funciones peligrosas en JavaScript, tales como `eval` o `innerHtml`. El "Live example" a continuación muestra un ataque DOM XSS basado en el archivo `innerHtml` función.
3. XSS almacenado
En este caso, el código malicioso se escribe en el lado del servidor. Por ejemplo, podemos enviar un comentario con código malicioso a una entrada de blog que se carga en el servidor. Su cometido es, por ejemplo, esperar la moderación del administrador para luego robar sus datos de sesión, etc.
Métodos de inyección
1. En el contenido de la etiqueta
`onerror=alert('XSS')`en
<img src onerror="alert('XSS')" />
2. En el contenido del atributo
`" onmouseover=alert('XSS')` en
<div class="" onmouseover="alert('XSS')""></div>
En el contenido del atributo sin las comillas
x onclick=alert('XSS')en
<div class="x" onclick="alert('XSS')"></div>
En el hrefatributo ef
javascript:alert('XSS') en
<a href="javascript:alert('XSS')"></a>
En la cadena dentro del código JavaScript
";alert('XSS')// en
<script>let username="";alert('XSS')//";</script>
En el atributo con el evento JavaScript
');alert('XSS')// donde ' es una comilla simple, en
Codificación de datos mediante funciones incorporadas que se encuentran en muchos lenguajes de programación.
Usar sistemas de plantillas con codificación automática. La mayoría de los frameworks populares que utilizan este tipo de sistemas nos protegen de la inyección XSS (Django, Templates, VueReact, etc.).
No utilice funciones como evalúe o Función con datos de usuarios no fiables.
No utilice funciones y propiedades que asignen código HTML directamente a los elementos del árbol DOM, por ejemplo innerHTML, outerHTML, insertAdjacentHTML, ocumento.escribir. En su lugar, puede utilizar funciones que asignen texto directamente a estos elementos, como textoContenido o innerText.
Tenga cuidado cuando redirija al usuario a una URL que esté bajo su control. Riesgo de inyección location = 'javascript('XSS')'.
Filtrar HTML utilizando bibliotecas como DOMPurificar.
Tenga cuidado al cargar .html o .svg archivos. Puede crear un dominio independiente desde el que se servirán los archivos cargados.
Utilice la Política de seguridad de contenidos mecanismo.
Eche un vistazo a los filtros anti-XSS integrados en los navegadores más populares.
Si te parece interesante este artículo, sigue a Lukasz en Github: https://github.com/twistezo