domingo, 22 de enero de 2012

PHPIDS 0.7 SQLi Bypass

PHPIDS es una aplicación web de detección de intrusos open source que podemos configurar en nuestras propias aplicaciones a fin de bloquear ataques conocidos (XSS, SQLi, LFI, RCE, etc).

Ayer me dieron ganas de jugar un poco con este IDS y buscar alguna forma de "bypassearlo" para poder explotar un SQLi. Luego de muchas pruebas, logré encontrar algo y, aunque aún no estoy satisfecho con los resultados, creo que no estaría mal publicar los avances.

Las pruebas las he realizado con PHPIDS 0.7 (la última versión a la fecha).

0. El entorno de pruebas

Seguramente a ti también te darán ganas de jugar y probar lo explicado en este post. Así que necesitarás un entorno donde hacer tus pruebas. Una forma fácil de conseguirlo es usando la demo que hay en la web de PHPIDS:

http://demo.phpids.org?test=[your test here]

Claro que también puedes descargar el proyecto, crearte una aplicación vulnerable y configurarla con PHPIDS.

1. Primeras pruebas

Primero veamos como detecta PHPIDS un clásico UNION SELECT

http://demo.phpids.org?test=-1 union select 1,2,3,4

Fig. 1 - Detección de "UNION SELECT".

Como verás hace match hasta con 3 firmas. Dos de ellas detectan la cadena "union select" y la otra detecta "-1 union".

Para lograr bypassear un IDS debemos modificar los segmentos de la cadena que son detectados de forma que no hagan match con ninguna firma.

Probemos con algo sencillo, alternamos mayúsculas y minúsculas

http://demo.phpids.org?test=-1 uNiOn SeLeCt 1,2,3,4

Fig. 2 - Alternando mayúsculas y minúsculas.

Da igual, nos sigue detectando los mismos segmentos. Seguro hace un "strtolower" antes de aplicar las firmas.

Para saltar la firma que detecta "-1 union" podemos probar usando paréntesis así:

http://demo.phpids.org?test=(1)and(0)union select 1,2,3,4

Fig. 3 - Bypass usando paréntesis.

Bien, ha dado resultado :) Pero aún quedan por evadir dos firmas. Probemos metiendo ruido entre "union" y "select" con un comentario.

http://demo.phpids.org?test=(1)and(0)union/*xDxD*/select 1,2,3,4

Fig. 4 - Bypass usando comentarios.

También ha dado resultado. Hemos logrado evadir la detección de "union select". Sin embargo, ahora hicimos match con otra firma que detecta las secuencias "/*" y "*/" de nuestros comentarios :/

Quizá estés pensando lo mismo que yo: si tan solo hubiese otra forma de meter ruido pero sin usar "/*" y "*/"...

2. %23BYPASS%0A

Luego de algunas pruebas se me ocurrió usar esta forma de comentario:

"%23comentario%0A"

La explicación es la siguiente:

Empezamos el comentario con un "%23" que es el caracter "#" en hexadecimal. Este caracter se usa para iniciar comentarios de linea en MySQL. Luego viene el texto del comentario y para terminar escribimos un "%0A" que no es más que un salto de linea codificado en hexadecimal. Con el salto de linea se pone fin a la linea y por lo tanto también al comentario.

Ahora la prueba de fuego:

http://demo.phpids.org?test=(1)and(0)union%23xDxD%0Aselect 1,2,3,4

Fig. 5 - Probando otra forma de comentario.

Y... aún nos detecta :(

Pero esta vez curiosamente no ha resaltado el segmento que está haciendo match.

Por alguna razón ilógica e inexplicable se me ocurrió inyectar el comentario repetidas veces y...

http://demo.phpids.org?test=(1)and(0)union%23xDxD%0A%23xDxD%0A%23xDxD%0A%23xDxD%0Aselect 1,2,3,4

Fig. 6 - PHPIDS 0.7 Bypass.

Esta vez sí logramos bypassear el IDS :D

Claro que todo esto no tiene validez mientras que MySQL no exprese su conformidad con la inyección y la ejecute.

Así que para no extenderme mucho, les dejo esta PoC en vídeo.



Por último debo decir que aunque se ha conseguido evadir el IDS para ejecutar algunas funciones, aún falta mucho para bypassearlo totalmente y extraer cualquier información de la base de datos. Conforme queramos ejecutar inyecciones más complejas irán apareciendo otras firmas que las detecten y habrá que buscar otras formas de evadir la seguridad.

Hasta aquí este post.

Un saludo.

5 comentarios:

  1. bien ahi.. alucina , no sabia que este ids estaba online para probar.. gracias por el dato.

    Bien ahi con la musika... pero un pokito mas rapido no lo puedes hacer ajajajaja... bien ahi con las teclas... XD jejejej mas despacio vro...en el video XD exitos

    ResponderEliminar
  2. Hola, estoy tratando de comunicarme contigo y no puedo, estuvimos en LimaHack 2011, mi correo es omarc320@gmail.com.
    Saludos,
    Omar

    ResponderEliminar
    Respuestas
    1. Hola Omar, te envie un correo.

      Un saludo.

      Eliminar
    2. Guarda con los riñoneros xD

      Eliminar
    3. Jajaja... aquí hay otro comentario mas sospechoso xD

      Eliminar