You are on page 1of 3

Hacking Newbie Inyeccion a ciegas SQL CUH

CUH e-zine 3ª Edicion


dicion

INYECCION SQL A CIEGAS I PARTE By Alesteir


una aplicación web, la cual usa los datos que recibe
INYECCION SQL ACIEGAS por parte del usuario (Cliente) para construir
(BLIND SQL INJECTION)
INJECTION) sentencias de consulta y de esta forma mostrar la
Para nadie es un secreto que unas información pertinente (solicitando los datos al
de las mayores vulnerabilidades de Servidor), ahora resulta que llegado el punto,
la red son las famosas inyecciones sabemos de su vulnerabilidad y procedemos a
SQL, pero existen variadas técnicas y una de ellas, es inyectar consultas pero no vemos los datos
la que actualmente se conoce como inyección a obtenidos, no obstante, podemos distinguir
ciegas de SQL (blind sql injection), este articulo es comportamientos distintos entre consultas que
una corta introducción al tema, y nos ayudara a muestran datos, y las que no lo hacen, es allí donde
comprender lo que son, como funcionan dichas basados en valores verdadero (true) o falso (false)
técnicas, y alguna cosilla mas, en un proximo que son devueltos por la aplicación, que debemos
numero del e-zine trataremos la forma de explotar saber el tipo de inyección ciega pertinente, para de
dichas vulnerabilidades. esta manera obtener los datos que deseamos poseer.
Para saber si un parámetro es vulnerable a una
inyección ciega de sql supongamos que tenemos una
web, y la pagina 467, por decir algo un ejemplo:

http://www.ejemplo.org/pagina.php?id=467

Entonces añadimos abs() de la siguiente manera:

http://www.ejemplo.org/pagina.asp?idpagina=abs(4
67)

Y si la página se muestra correctamente sabremos


Inyección SQL que la web es vulnerable a un ataque a ciegas de
inyección SQL.
Una inyección de código SQL esta basada en una
interacción de un intruso con el motor de una base
de datos, en la cual el atacante puede obtener y
hasta modificar los datos, e incluso el atacante
puede llegar a obtener y manipular archivos, con la
consecuencia de poder manejar los datos y el
sistema a su antojo y con total libertad. Todo ello se
debe a la mala validación y filtrado de los datos
introducidos por el usuario (Cliente), por parte de la
aplicación Web (Servidor) que maneja el gestor de la
base de datos, de forma que el intruso puede
alterar las sentencias SQL aceptadas por la
aplicación server.

Injeccion Ciega de SQL

Esta técnica se usa cuando una web no muestra los


típicos mensajes de error de la base de datos, al no
haber un resultado positivo en una consulta
especifica, o sea que solo se enviará una respuesta
por parte del servidor si el resultado es correcto. Es
por ello que sentencias que contengan entre sus
condiciones valores comparativos como 1=1 o
0=1 ofrecen respuestas, bien sea respuestas
negativas o positivas, esta es la base de esta técnica
de inyección SQL. Ahora Supongamos que tenemos
Hacking Newbie Inyeccion a ciegas SQL CUH
CUH e-zine 3ª Edicion
dicion
Inyeccion a ciegas basado en tiempos de respuesta

Las primeras referencias en cuanto al tema las hizo


Chrish Anley en el documento: Advanced SQL Microsoft SQL Server :
Injection” en el 2002 hacia referencia de la
posibilidad de realizar ataques a ciegas basado en http://server/ejemplo.php?id=35; if (exists(select *
tiempos de respuesta , en dicho documento el from Passwords)) waitfor delay ‘0:0:8’—
explicaba códigos, métodos y practicas para hacer
consultas sin importar si obteníamos resultados En la anterior consulta el motor evalúa si la tabla
palpables, e indefectiblemente saber si eran ciertas Passwords existe y si contiene registros, al cumplirse
o no, todo ello dependiendo, de el tiempo en que el la condición la respuesta se retardará por un lapso
motor de la base de datos tardaba en dar la de 8 segundos, es bueno recalcar que no todos los
respectiva respuesta a la consulta. A partir de allí se gestores permiten la técnica de inyección a ciegas
empezó a indagar por parte de otras mentes con retardo de tiempo
inquietas, pronto se descubrieron parámetros
vulnerables a inyección SQL, de forma que sin Inyección a ciegas basado en tiempos de respuesta
necesidad de ver los resultados de la consulta, se usando consultas pesadas
podían conseguir resultados a partir del tiempo de
respuesta dado por el gestor (y con un poco de Existe otra técnica que se basa en usar consultas
lógica se podían transforman en datos reales), otros pesadas, las cuales al exigir al motor de bases de
mas osados crearon herramientas para explotar datos y de manera obvia generar un retardo de
(exploits) dichos parámetros vulnerables a tiempo ante respuestas positivas. Supongamos que
inyecciones ciegas y hasta que con el tiempo se sabemos cual es el parámetro vulnerable de una
volvió ya todo un tópico, a la hora de penetrar un consulta y queremos saber si existe una tabla X en
sistema basado en consultas a un gestor de base de especial, aquí optaríamos por elaborar una consulta
datos. La técnica consiste en generar retardos en las que solo haga trabajar al motor un tiempo extra con
inyecciones, y la mejor forma de usar esta nuestra consulta pesada si dicha sentencia cumple la
vulnerabilidad, es conociendo las funciones condición de que la tabla X exista en la base de
especificas cada motor de base de datos, benchmark
benchmark datos, de otra forma no lo haría y por lógica el
(sleep en la versión 5 y posteriores) en mysqlm, tiempo de respuesta seria distinto, es aquí donde se
waitfor en SQL server, DBMS_Lock.Sleep() en deben conocer las clausulas y el tipo de condiciones
Oracle; por nombrar solo algunas. que se pueden llegar a manejar, (tal como sucede
con la clausula Where), para así mismo poder
Veamos pues la forma de inyectar código a ciegas elaborar adecuadamente nuestro consulta , para ello
en distintos gestores: se hace necesario conocer la evaluación de las
condiciones por parte de los gestores, en el caso de
la clausula Where , si la cláusula tiene encadenada
sus condiciones por operadores de tipo OR la
consulta se evaluará, mientras ninguna condición
devuelva un resultado verdadero, contrariamente
cuando están encadenadas por operadores de tipo
Mysql_
Mysql AND las condiciones se evaluarán mientras ninguna
devuelva un valor falso, basado en este mecanismo
http://server/ejemplo.php?id=35 and exists(select * es que se optimiza el tiempo de respuesta para las
from Passwords and condiciones, es por ello que los motores tienen un
benchmark(8000000,md5(rand()))=0 orden a la hora de hacer la evaluación, pero es el
programador quien realmente define el orden de las
Mysql (versiones 5): condiciones en una clausula Where, veamos por
ejemplo la siguiente consulta:
http://server/ejemplo.asp?id=35 and exists(select *
from Passwords) and sleep(8) Select nombre from Passwords where nombre=Aleks
and pass=qwerty;

Select pass from Passwords where nombre=Aleks or


pass=qwerty;
Oracle:
En el primer caso usamos una condición AND, si al
http://server/ejemplo.php?id=1; begin if (exists(select evaluar la primera condición obtenemos un valor
* from Passwords)) then dbms_lock.sleep(8); end if; FALSO el gestor no evaluar la otra, en la segunda
end; consulta con el operador OR si la primera condición
es VERDADERO no se evalúa la siguiente condición.
Sucede que no siempre es el gestor el que realiza la
Hacking Newbie Inyeccion a ciegas SQL CUH
CUH e-zine 3ª Edicion
dicion
optimización, es entonces donde el programador la cuenta con que accedamos al servidor. También
debe saber la precedencia y el mismo efectuar la existen otro tipo de técnicas que nos permiten
optimización, pudiendo ser de izquierda a derecha o hacernos con archivos directamente del sistema
viceversa. operativo del servidor, con esto ya tenemos casi que
Actualmente los motores modernos estiman el tiempo un acceso total a la web. Existen distintas funciones
de cada condición y evalúan primero la condicional en cada gestor por ejemplo en Microsoft SQL Server
de menos valor en tiempo real de ejecución, esta 2005 tenemos las funciones OpenRowset y BULK que
particularidad es la que nos permite aprovecharnos se manejan combinadas, he aquí dos ejemplos :
de este tipo de situación. http://www.ejemplo.org/pagina.php?id=1 and (select
datalength(Z) from OpenRowset(BULK 'c:\Boot.ini',
Imaginemos que tenemos el parámetro vulnerable
SINGLE_CLOB) as t(Z)) >1
id_usuario en alguna URL:
http://www.ejemplo.org/pagina.php?id=1 and
http://www.ejemplo.org/pagina.asp?id_Usuario=1 (select substring(Z,{PosByte},1) from
OpenRowset(BULK 'c:\ Boot.ini', SINGLE_CLOB) as
Con lo dicho anteriormente, si quisiéramos saber si t(Z)) > 5
una tabla existe realizamos más o menos la siguiente Es asi como podríamos automatizar el proceso y
consulta: obtener todo el contenido del archivo con un código
que llame uno a uno los caracteres del archivo que
http://www.ejemplo.org/pagina.asp?id_Usuario=1 vamos a conseguir.
[nuestra
nuestra consulta pesada]
pesada and exists (select * from
Passwords) En MySQL podemos usar la función LOAD_FILE, la
cual acepta como parámetro la ruta del archivo,
De lo anterior deducimos que si la tabla claves pero en hexadecimal. Ahora si queremos realizar un
existe, nuestra consulta pesada se efectuara ataque a el archivo c:Boot.ini debemos primero que
generando un retraso de tiempo considerable, lo todo convertirlo a hexadecimal:
cual nos revelará que efectivamente la tabla 0x633A5C626F6F742E696E69 con esto podemos
Passwords existe y que además posee mas de un proceder con la inyección:
registro. La elección de nuestra consulta pesada será http://www.ejemplo.org/pagina.php?id=1 and
la clave a la hora de saber el retardo y por ende mid(Load_File(0x633A5C626F6F742E696E69),1,1)=C
saber si nuestra consulta ha sido efectiva. Entonces HAR(34)
como elegimos nuestra consulta pesada? La
La condición será positiva, si la primera letra del
respuesta se da conociendo las tablas internas para
archivo corresponde con el carácter ASCII 34., es asi
cada gestor de base de datos, por ejemplo en SQL
que por medio de automatización y de fuerza bruta
Server tendríamos “sysobjects” y en Access
podríamos obtener todos los datos de un archivo,
tendríamos “MSysObjects”; o tablas propias de la
alginas herramientas se basan en este método
web vulnerable, que por obvias razones nosotros
seriamos quienes deduciríamos aquellas tablas que
contienen registros, de esta forma podemos medir
los tiempos entre una consulta que cumpla las
condiciones y una que no. Podemos generar
consultas pesadas es unir tablas con otra s y otras
hasta generar una cantidad grande de registros de Para una próxima edición queda la parte final de
forma que tan que obliguen al servidor a consumir este articulo, espero que les haya gustado!
un tiempo medible en procesarlo. Para ello basta Suertes!!!
con conocer o averiguar o adivinar una tabla del By Alesteir
Alesteir
sistema de bases de datos, que tenga algún registro,
y unirla consigo misma hasta generar un tiempo
medible. Vamos a ver algunos ejemplos.
Según lo dicho anteriormente podemos hacer la
siguiente consulta en la cual se invierte la condición y
así poder comparar los tiempos entre cada una de
ellas:

http://www.ejemplo.org/pagina.asp?id_Usuario=1
[nuestra pesada and not exists (select *
nuestra consulta pesada]
from claves)
Otras técnicas de Blind SQL Injection
De esta forma ya sabemos que podemos consultar a
ciegas cada uno de los elementos del motor de una
base de datos vulnerable, es lógico que
dependiendo todo ello de los tipos de privilegios de

You might also like