(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, Autor en The Codest - Página 10 de 13

Escenario de ataque

  1. El atacante localiza la vulnerabilidad XSS en un sitio web utilizado por la víctima, por ejemplo, el sitio web de un banco
  2. La víctima está actualmente conectada a esta página
  3. El atacante envía a la víctima una URL manipulada
  4. La víctima hace clic en la URL
  5. 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>

  1. En el contenido del atributo sin las comillas

x onclick=alert('XSS')en

<div class="x" onclick="alert('XSS')"></div>

  1. En el hrefatributo ef

javascript:alert('XSS') en

<a href="javascript:alert('XSS')"></a>

  1. En la cadena dentro del código JavaScript

";alert('XSS')// en

<script>let username="";alert('XSS')//";</script>
  1. En el atributo con el evento JavaScript

');alert('XSS')// donde ' es una comilla simple, en

<div onclick="change('&#39;);alert('XSS')//')">John</div>

  1. En el href dentro 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

  1. Codificación de datos mediante funciones incorporadas que se encuentran en muchos lenguajes de programación.
  2. 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.).
  3. No utilice funciones como evalúe o Función con datos de usuarios no fiables.
  4. 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.
  5. Tenga cuidado cuando redirija al usuario a una URL que esté bajo su control. Riesgo de inyección location = 'javascript('XSS')'.
  6. Filtrar HTML utilizando bibliotecas como DOMPurificar.
  7. Tenga cuidado al cargar .html o .svg archivos. Puede crear un dominio independiente desde el que se servirán los archivos cargados.
  8. Utilice la Política de seguridad de contenidos mecanismo.
  9. 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

API de Rails y CORS. Una pizca de conciencia

¿Por qué debería (probablemente) utilizar Typescript?

es_ESSpanish