viernes, 1 de julio de 2011

Una inyección bastante especial

Hoy quiero contarles una experiencia que tuve al intentar explotar una vuln SQLi algo especial. Sucede que no siempre es tan fácil como hacer un UNION SELECT y listarse toda la información de la base de datos... Algunas veces nos topamos con IDS's (Sistemas de Detección de Intrusos) que filtran los ataques y nos pueden complicar bastante la explotación. Precisamente ello es lo que me sucedió así que aprovecharé esto a modo de ejemplo para contarles como afrontar esos problemas...

Bien la página vulnerable luce así:

Fig. 1 - Página vulnerable.

En la URL se observa el parámetro "cat" que es donde va la inyección. Luego de provar un poco obtuve que la consulta selecciona 5 columnas.

Fig. 2 - Ordenando por 5.

Fig. 3 - Ordenando por 6.

Acto seguido realicé la típica inyección UNION SELECT y este fue el resultado:

Fig. 4 - Inyección UNION SELECT normal.

Como se observa, mi proxy indica que la conexión ha sido droppeada. Es decir que algún IDS o sistema similar ha bloqueado la conexión por considerarla un ataque ¿Pero cómo es que un IDS reconoce que estoy atacando su red? La forma más común de reconocer un ataque es usando patrones. Es decir, el IDS tiene configuradas un conjunto de reglas que le permiten identificar un patrón de ataque (algo así como las firmas de los antivirus). Si al examinar la información que enviamos, esta hace match con alguna de las reglas del IDS entonces nos bloqueará.

Lo que debemos hacer, entonces, para evadir un IDS es modificar nuestra inyección de forma que no haga match con ninguna de las reglas del IDS. Dependiendo de que tan bien estén configuradas dichas reglas, esta tarea podrá ser poco o bastante complicada.

En mi caso fue muy sencillo evadir la protección xD (es decir, el IDS estaba pésimamente configurado). Solo bastó con reemplazar los espacios en blanco con comentarios multilinea y meter algo de ruido en los comentarios.

Fig. 5 - Inyección UNION SELECT ofuscada.

Otras modificaciones que podemos hacer son:
  • Alternar minúsculas y mayúsculas. Ej: UniON SeLECt
  • Usar UNION ALL SELECT en vez de UNION SELECT. Ej: UNION ALL SELECT 1,2,3
  • Encerrar los valores entre paréntesis múltiples. Ej: UNION SELECT (1),((2)),(((3)))
  • Usar diferentes codificaciones (unicode, urlencode, etc)
  • O cualquier cosa que creas que hará que tu inyección no sea reconocida.

También existen técnicas más avanzadas de evasión de IDS's como por ejemplo el HTTP Smuggling, la fragmentación de paquetes, el overlaping, incluir ruido usando TTL variable o engañar al IDS enviando un paquete RST con cheksum invalido.

Bien, volviendo a lo nuestro... en la imagen anterior vemos que ya no se bloquea la conexión pero sin embargo no aparece ningún campo visible :S Por ello decidí hacer otra prueba, esta vez cambié el tipo de los datos seleccionados a ver que pasaba (seleccioné letras).

Fig. 6 - Selección de letras.

Observamos que se produce un error. Si nos fijamos, la letra "b", que se selecciona en la segunda columna, esta siendo usada en la condicional de otra consulta y por ello se produce el error. Ahora, dado que la web muestra los errores en el navegador, podemos usar el campo "b" para extraer la información.


Bien, eso es todo por hoy...

Un saludo.

4 comentarios:

  1. Muy bien, lo pondre en mi curso de SQLi avanzado. Gracias ;).

    ResponderEliminar
  2. Por cierto, este este es el sitio:
    http://www.ciberdocencia.gob.pe/index.php?cat=179

    Ups ;) ......

    ResponderEliminar
  3. jajajaja q pendex, gr ksprv

    ResponderEliminar
  4. Creo que esta es la enésima vez que sucede... xD No cabe duda que los lectores de este blog saben usar Google U.U

    ResponderEliminar