martes, abril 03, 2012

Optimización de ataques Blind SQL Injection en MySQL con funciones de compresión: COMPRESS y UNCOMPRESS

Una de los temas que se tratan en el libro de Hacking de Aplicaciones Web: SQL Injection es el tema d ela optimización del proceso de extracción de datos con vulnerabilidades Blind SQL Injection utilizando diferentes aproximaciones. Una de ellas es la de utilizar funciones de compresión de texto en motores MySQL.

El gran problema de los ataques Blind SQL Injection es la optención de grandes cantidades de datos con un proceso de booleanización, si es necesario obtener esos datos, el tiempo que se tarda es grande. Sin embargo, existen muchas formas de reducir ese tiempo, y una de ellas, y muy sencilla en entornos MySQL es la compresión de texto.

El caso base

Supongamos un valor alfanumérico de 30 caracteres de longitud que, para este ejemplo concreto se ha elegido que sea tres veces concatenada la versión de un motor MySQL 5.1.38-log. Así el valor a extraer por medio de booleanización sería:
 5.1.38-log5.1.38-log5.1.38-log
En un proceo de extracción normal, en cada petición se podría extraer el valor de un bit, 8 peticiones para cada byte, o lo que es lo mismo, un total de 240 peticiones para extraer esta cadena de 30 caracteres.

¿Cómo optimizar esto?

Para hacer que haya que sacar menos datos una buena aproximación es comprimir el texto con la función COMPRESS que devuelve como valor binario la compresión de la cadena introducida. Así, si miramos la longitud de esta preuba de concepto, el resultado sería:
length(compress(concat(version(),version(),version())))=25
Es decir, se han reducido 5 byte, o lo que es lo mismo, 40 bits, un total de 40 peticiones menos, lo que nos permitiría sacar el valor en 200 peticiones. Esto es una optimización del 16,6 %, lo que en una extracción de datos de 20 MB puede significar un tiempo grande.

Por supuesto, la booleanización sería exactamente igual, solo que hay que hacer uso antes de la función compress, y al final se obtendría una secuencia de valores de bytes como sigue:
30 0 0 0 120 156 51 213 51 212 51 182 208 205 201 79 55 197 194 2 0 114 105 7 213
Obteniendo el dato final

Por último, solo habría que hacer uso descompresión del valor para obtener el resultado. Esto se puede hacer con cualquier interfaz de comandos MySQL, y ejecutando la función UNCOMPRESS.


Hay que tener en cuenta que a veces, si el valor es muy pequeño puede que la función no consiga sacar buenos resultados. Para ello, lo mejor es asegurarse de que siempre son resultados con un cierto tamaño. La forma más eficiente de automaticar el proceso con una herramienta es hacer uso de la función Concat para generar en un único resultado todos los atributos de un registro.

Cuando te dedicas a hacer auditoría de seguridad web, estas ayudas pueden hacer que tu trabajo sea un poco más cómodo, especialmente en casos en los que estás descargando un fichero del sistema a través de MySQL con Blind SQL Injection o estás haciendo un ataque de Time-Based Blind SQL Injection.

Saludos Malignos!

Entradas populares