Técnicas para evadir WAFs

Muchos sitios web actualmente utilizan CDN (Content Distribution Network) o balanceadores de carga, actuando como intermediarios entre un sitio web y sus usuarios finales. Una de sus características es actuar como WAF (Web Application Firewall), permitiendo que los sitios web se protejan contra la explotación de vulnerabilidades basadas en web, como son inyecciones de SQL y XSS, por mencionar algunas.

Desafortunadamente, estos sitios a menudo están mal configurados, lo que permite a un atacante eludir fácilmente la protección que ofrecen y así explotar vulnerabilidades que de lo contrario se bloquearían.

La forma correcta en que debe comportarse un servidor detrás de estos es solo aceptar el tráfico procedente de los intervalos de IP específicos. Sin embargo, muchos servidores aceptan el tráfico entrante desde cualquier fuente. Un atacante podría identificar la IP del servidor y realizar las peticiones directamente, ya que el tráfico generado no pasa por estos servicios o balanceadores.

Si se conoce la IP del servidor es posible realizar lo siguiente para evadir la seguridad de estos WAF:

1.-Acceder a la aplicación o sitio web directamente por la dirección IP.

2.-Modificar el archivo “host”, “/etc/hosts” en Linux o “c:\windows\system32\drivers\etc\hosts” en Windows, y agregar la IP y el dominio para acceder al sitio sin pasar por la validación del balanceador o CDN.

3.-Sobrescribir los DNS si se está usando “burpsuite”; esta es la mejor opción en una prueba de seguridad” Project Options -> Hostname Resolution”, agregar la entrada para sobrescribir los DNS de resolución.

Sitio configurado correctamente, el cual no es posible acceder mediante la IP

Hay ocasiones cuando los WAF se encuentran configurados correctamente y la evasión de WAF tiene que hacerse de una forma más creativa, utilizando “payloads” más elaborados; a continuación, veremos unos ejemplos de cómo lograrlo.

Durante la revisión de seguridad a una aplicación web se identificó una inyección de tipo XSS en una funcionalidad de carga de archivo.

Funcionalidad de carga de archivo.

La inyección XSS fue identificada al modificar el nombre del archivo a cargar, en la petición enviada al servidor.

El atributo “filename=” contiene el nombre del archivo que se carga al servidor.

Al modificar el nombre del archivo e ingresar algunos “payloads” para realizar la inyección XSS se obtiene una respuesta de bloqueo; algunos de los “payloads” usados fueron los siguientes:

<script>alert(1)</script>
<img src=xssonerror=alert(1)>
<input/onmouseover=”javaSCRIPT&colon;confirm&lpar;1&rpar;”
<iframe %00 src=”&Tab;javascript:prompt(1)&Tab;”%00>

Respuesta del servidor tras enviar código “Javascript”.

Cada petición enviada al servidor que contenía las palabras “<script>”, “<frame>”, “<input>”, “<form>”, fueron bloqueadas por el WAF, y para que la inyección sea exitosa es necesario utilizar un “payload” que no tenga las palabras que están siendo bloqueadas.

Utilizando el siguiente “payload”, el cual no tiene las palabras que bloquea el WAF, se espera que no sea bloqueado:

<svg olnload=alert(‘AppSec&nbsp;Seguridad’)>.jar

Petición enviada con el código “Javascript”

Con el “payload” utilizado fue posible realizar la inyección XSS y saltarse la validación del WAF.

En el navegador podemos observar el XSS

Uno de los métodos para probar inyecciones SQL es utilizando los operadores “UNION” y “SELECT”; el siguiente “payload” fue utilizado para probar si el sitio era vulnerable a inyección SQL:

[“1807192982′)) union select 1,2,3,4,5,6,7,8,9,0,11#”]

En la respuesta del servidor podemos observar que la petición fue bloqueada por WAF

Utilizando el mismo “payload” separamos el operador “unión” y “select” con los caracteres “,” quedando de la siguiente forma.

[“1807192982′)) union se”,”lect 1,2,3,4,5,6,7,8,9,0,11#”]

Respuesta obtenida tras modificar el “payload”

Después de modificar el “payload” fue posible evadir el WAF.

En estos ejemplos fue posible lograr evadir el WAF debido a que bloquearon las peticiones que contenían palabras como: “<script>”, “<frame>”, “<input>”, “<form>”, e ingresando un tag “<svg>” fue posible inyectar código “Javascript”. Para el ejemplo de SQL, fue posible evadir el WAF debido a que este bloqueaba la petición enviada que contenía operadores SQL, pero al dividir la sintaxis con comillas y una coma permitió enviar el código SQL.  En conclusión, no existe un método que siempre funcione para evadir WAFs. Para lograrlo dependerá de la tecnología que tenga el sitio y las configuraciones con las que cuente. Una vez identificada una posible vulnerabilidad que se encuentre bajo un WAF, el siguiente paso será analizar la tecnología y tratar de explotarla con todas las posibilidades.