viernes, 16 de febrero de 2018

SQL Injection para dummies (Primera parte)

Buenas a todos, este es mi primer post en el blog tras el inicio de los C43S4RS. No sabía muy bien de qué hablaros puesto que mis compañeros del grupo tienen muy buenas ideas y proyectos para plasmar aquí, y por supuesto no quería pisarles ninguna, así que al final me he decidido a escribir sobre SQL Injection.


Lo guay sería que reprodujerais lo que voy a explicar aquí vosotros también, así que para empezar veamos el escenario que tenemos que montarnos. Es muy sencillito. Vamos a emplear la archi-conocida DVWA, que podéis descargar en su página oficial http://www.dvwa.co.uk/ . Vamos a colocarla en un Debian 9 de 64 bits, virtualizado con Virtualbox. Para cumplir con todas las dependencias simplemente haced " sudo apt-get -y install apache2 mysql-server php php-mysqli php-gd " y colocad la carpeta descargada de DVWA en /var/www/html . Ponemos a correr el servidor Apache con " sudo service apache2 start " y ya tendríamos acceso a la aplicación vulnerable. Para el resto de configuraciones os remito a la página del creador de la aplicación, que aquí vamos con otros menesteres https://github.com/ethicalhack3r/DVWA


Una vez tenemos abierta la aplicación en nuestro navegador y hacemos login (admin:password) cambiamos el nivel de dificultad en el apartado de “DVWA Security” a “Low”, y después nos vamos al apartado de “SQL Injection”. Y aquí empieza el juego.


Tenemos un campo de un formulario en el cual se busca un usuario de la base de datos por su ID. Si vamos probando números veremos que solamente hay IDs del 1 al 5. Podemos observar en la url que va cambiando el parámetro "id", y la url está formada de esta manera: " http://[LA IP DE TU MAQUINA VIRTUAL]/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit# "



Para probar si un parámetro es vulnerable a SQL Injection, la forma universal de probarlo es poniendo una comilla simple ( ‘ ) y observando si sale algún error en la página resultante, como que hay un error sintáctico en la consulta o algo parecido. Pero antes de que os liéis a poner comillas simples en todos los campos de formularios que os encontréis de aquí en adelante, es importante saber por qué sale ese error cuando un parámetro es vulnerable:

Las consultas de búsqueda básicas en SQL suelen ser algo del estilo “ SELECT id, nombre FROM users WHERE id = ‘[parámetro introducido]’; ” (tomando la que estamos intentando vulnerar como ejemplo). Por tanto se seleccionan el id y el nombre del usuario de la base de datos cuyo id es igual al parámetro introducido.

Hasta aquí todo bien, parece que cumple su función. El problema viene cuando introducimos la comilla simple en el parámetro, ya que si os fijáis, la parte de la comparación del WHERE viene con comillas simples en la parte del parámetro introducido. Por tanto al introducir esa comilla simple, quedaría algo como WHERE id = ‘ ‘ ‘; lo cual es un error sintáctico en SQL, ya que la tercera comilla simple ahora pasa a ser una comilla simple de inicio, y queda sin cerrar.

Puede parecer que me entretengo con cosas que ya muchos hacen de carrerilla, pero creo necesaria una explicación así de detallada ya que muchas veces probamos cosas que funcionan sin saber, y luego no somos capaces de ir más allá porque no entendemos realmente cómo funcionan las cosas por debajo.


Después de tanta palabrería, volvemos al lío y ponemos la comilla simple en el campo del ID, observando el mensaje que habíamos mencionado antes: “ You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''''' at line 1 ”. Esto significa que ese parámetro es vulnerable a SQL Injection, y que por tanto ya podemos empezar a jugar con él.


Hasta aquí la primera entrada. Estos posts van a servir principalmente a aquellos que están iniciándose en el pentesting web, para intentar profundizar al máximo en los conceptos básicos y que de ahí tengan una buena base para seguir aprendiendo.

Un saludo y hasta el próximo post.

AlDr0id

0 comentarios:

Publicar un comentario