domingo, 4 de agosto de 2013

Adivina adivinanza: blind SQL Injection

La traducción literal de blind SQL injection viene a ser ataque de inyecciones SQL a ciegas, es decir, que debido a las condiciones expuestas no podremos imprimir en pantalla la información de las consultas que manipulemos, pero ello no implica que no podamos provocar condiciones controladas que puedan ser analizadas desde el cliente.

La base de este ataque se puede asemejar al conocido juego popular adivina adivinanza. Nosotros no podremos obtener la respuesta directamente, sino que tendremos que ir formulando una serie de preguntas que serán respondidas lógicamente (si/no) y con las que iremos cercando el trecho hasta dar con el resultado.


Situándonos un poco, somos nosotros quienes realizamos las preguntas oportunas al servidor mediante el ataque descrito anteriormente, y poco a poco iremos obteniendo la respuesta deseada, que podría ser desde la contraseña de un usuario específico hasta el nombre de una tabla.

El proceso para sonsacar esta información puede ser algo engorroso, pues cuando queramos consultar un dato deberemos reconstruirlo letra a letra. Teniendo en cuenta que a cada letra le corresponde un código (tabla ASCII), una forma óptima para no tener que ir preguntando por cada una de las letras posibles sería la siguiente:

¿La primera letra de la cadena es mayor que 127? No.
¿La primera letra de la cadena es mayor que 63? Sí.
¿La primera letra de la cadena es mayor que 95? No.
¿La primera letra de la cadena es mayor que 79? Sí.
¿La primera letra de la cadena es mayor que 87? No.
¿La primera letra de la cadena es mayor que 83? No.
¿La primera letra de la cadena es mayor que 81? Sí.
¿La primera letra de la cadena es mayor que 82? Sí.

La primera letra de la cadena es S (número 83).

Y de esta manera con cada una de las letras del dato que estamos consultando, hasta que el valor devuelto sea cero, por lo que se entenderá que es el fin de la cadena.

El algoritmo sigue el principio matemático divide y vencerás. El número máximo de preguntas formuladas antes de obtener la respuesta queda representado con las siguiente función, siendo x el número total de posibles respuestas.


Lo que viene a ser el resultado de la raíz cuadrada del número total de posibles respuestas redondeado al alza. Es decir, que para adivinar un número comprendido entre 0 y 255 (256 números) obtendremos el resultado en no más de 8 preguntas tal como muestra el ejemplo anterior.

El principal problema aparece cuando queremos recoger esas respuestas lógicas dadas por el servidor. No podemos mostrar datos en pantalla, no podemos establecer una comunicación directa, pero podemos crear condiciones controladas, como provocar una demora de tiempo en la respuesta dada por el servidor si el resultado es sí, y no provocar esta demora cuando el resultado sea no.

Otra condición controlada puede ser generar errores para que se impriman en pantalla y así poder evaluar la respuesta; si hubo un error la respuesta es sí, de lo contrario sería no, o viceversa. El problema de éste último método es que algunos servidores tienen deshabilitado las notificaciones de errores hacia el cliente.

En definitiva, las intenciones son crear anomalías controladas para poder evaluar la respuesta.

JavaScript/NodeJS Guess es una ligera función que provee un entorno amigable para la obtención de la respuesta correcta mediante el sometimiento de preguntas, o dicho de otra manera, su finalidad es descartar resultados mediante preguntas lógicas (sí/no) hasta que finalmente quede una sola respuesta.

Un ejemplo de ello podría ser el siguiente; la adivinación de un número entre 0 y 255 (ambos inclusive). Para ello piense un número comprendido entre el rango anterior y a continuación pulse sobre ejecutar.

Ejecutar

Realizar las peticiones pertinentes haciendo uso de este entorno, simplifica la construcción del ataque, que puede llegar a complicarse cuando partimos desde cero; empezando por los nombres de las bases de datos, pasando por los nombres de las tablas y columnas, y terminando con la construcción de la consulta adecuada para sonsacar la información.

Está claro que el ataque se puede simplificar aún más centrándonos exclusivamente en los caracteres permitidos de MySQL y dentro de estos, ideando un algoritmo para consultar las letras por orden de frecuencia de uso según el alfabeto (españolinglésfrancés, etc), pero esto no lo abordaremos en este artículo.

Quizá en próximas entregas entre más en detalle con ejemplos y la puesta en práctica del ataque sobre el entorno comentado.

No hay comentarios:

Publicar un comentario