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, JavaScript código comienza a ejecutarse para interceptar el datos 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 ésta, ya que pueden tener lugar en segundo plano utilizando el API, o el atacante puede realizarlos 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
<div onclick="change('');alert('XSS')//')">John</div>
- En el
hrefdentro del protocolo JavaScript
);alert(1)// donde %27 es una comilla simple, en
<a href="javascript:change('%27);alert(1)//')">haga clic en</a>
Ejemplo en directo
Métodos de defensa
- Codificación de datos mediante funciones incorporadas que se encuentran en muchos lenguajes de programación.
- Utilizar sistemas de plantillas con codificación automática. La mayoría de los frameworks populares que utilizan este tipo de sistemas protegen us de inyección XSS (DjangoPlantillas, Vue, React etc.).
- No utilice funciones como
evalúeoFuncióncon 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, comotextoContenidooinnerText. - 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
.htmlo.svgarchivos. Puede crear un dominio independiente desde el que se servirán los archivos cargados. - Utilice la
Política de seguridad de contenidosmecanismo. - 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
Más información:
Estrategias de obtención de datos en NextJS