Este artículo explica cómo probar si un sitio web es seguro de inyección SQL utilizando la herramienta de pruebas de penetración SQLMAP.

¿Qué es la inyección SQL?

La inyección SQL es una técnica de inyección de código donde un atacante ejecuta consultas SQL maliciosas que controlan la base de datos de una aplicación web. Con el conjunto adecuado de consultas, un usuario puede obtener acceso a la información almacenada en las bases de datos. SQLMAP comprueba si un parámetro ‘GET’ es vulnerable a la inyección SQL.
Por ejemplo, considere el siguiente segmento de código php:

$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");

Si el usuario introduce «value’); DROP TABLE table;-» como entrada, la consulta se convierte en

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

lo que no es deseable para nosotros, ya que aquí la entrada del usuario se compila directamente junto con la consulta sql preescrita. Por lo tanto, el usuario podrá introducir una consulta sql necesaria para manipular la base de datos.

¿Dónde se puede utilizar SQLMAP?

Si observa una url web que tiene la forma http://testphp.vulnweb.com/listproducts.php?cat=1, donde el parámetro ‘GET’ está en negrita, entonces el sitio web puede ser vulnerable a este modo de inyección SQL, y un atacante puede ser capaz de acceder a la información de la base de datos. Además, SQLMAP funciona cuando está basado en php.

Una prueba sencilla para comprobar si su sitio web es vulnerable sería sustituir el valor del parámetro de petición get por un asterisco (*). Por ejemplo,

http://testphp.vulnweb.com/listproducts.php?cat=* 

Si esto resulta en un error como el que se da arriba, entonces podemos decir de manera concluyente que el sitio web es vulnerable.

Instalación de sqlmap

SQLMAP viene pre – instalado con kali linux, que es la opción preferida de la mayoría de los probadores de penetración. Sin embargo, puedes instalar sqlmap en otros sistemas linux basados en debian usando el comando

 sudo apt-get install sqlmap 

Usage

En este artículo, haremos uso de un sitio web que está diseñado con vulnerabilidades para fines de demostración:

 http://testphp.vulnweb.com/listproducts.php?cat=1 

Como puedes ver, hay un parámetro de solicitud GET (cat = 1) que puede ser cambiado por el usuario modificando el valor de cat. Así que este sitio web podría ser vulnerable a una inyección SQL de este tipo.
Para comprobarlo, utilizamos SQLMAP. Para ver el conjunto de parámetros que se pueden pasar, escribe en el terminal,

 sqlmap -h 

Los parámetros que utilizaremos para la Inyección SQL básica se muestran en la imagen anterior. Junto con estos, también utilizaremos los parámetros -dbs y -u, cuyo uso se ha explicado en el Paso 1.
Usando SQLMAP para probar un sitio web en busca de una vulnerabilidad de Inyección SQL:

  1. Paso 1: Listar la información sobre las bases de datos existentes
    Entonces, en primer lugar, tenemos que introducir la url de la web que queremos comprobar junto con el parámetro -u. También podemos usar el parámetro -tor si queremos probar el sitio web usando proxies. Ahora, típicamente, querríamos probar si es posible obtener acceso a una base de datos. Para ello utilizamos la opción -dbs. -dbs lista todas las bases de datos disponibles.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs 

    Obtenemos la siguiente salida que nos muestra que hay dos bases de datos disponibles. A veces, la aplicación te dirá que ha identificado la base de datos y te preguntará si quieres probar otros tipos de bases de datos. Puede seguir adelante y escribir ‘Y’. Además, puede preguntarte si quieres probar otros parámetros en busca de vulnerabilidades, escribe ‘Y’ aquí ya que queremos probar a fondo la aplicación web.


    Observamos que hay dos bases de datos, acuart y information_schema

  2. Paso 2: Listar la información sobre las tablas presentes en una base de datos concreta
    Para intentar acceder a cualquiera de las bases de datos, tenemos que modificar ligeramente nuestro comando. Ahora utilizamos -D para especificar el nombre de la base de datos a la que deseamos acceder, y una vez que tenemos acceso a la base de datos, queremos ver si podemos acceder a las tablas. Para ello, utilizamos la consulta -tables. Accedamos a la base de datos acuart.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables 

    Tables

    En la imagen anterior, vemos que se han recuperado 8 tablas. Así que ahora sabemos definitivamente que el sitio web es vulnerable.

  3. Paso 3: Listar la información sobre las columnas de una tabla en particular

    Si queremos ver las columnas de una tabla en particular, podemos usar el siguiente comando, en el que usamos -T para especificar el nombre de la tabla, y -columns para consultar los nombres de las columnas. Intentaremos acceder a la tabla ‘artistas’.

     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns 

    Columnas

  4. Paso 4: Volcar los datos de las columnas
    De forma similar, podemos acceder a la información de una columna específica utilizando el siguiente comando, donde -C se puede utilizar para especificar el nombre de varias columnas separadas por una coma, y la consulta -dump recupera los datos
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump 

    De la imagen anterior, podemos ver que hemos accedido a los datos de la base de datos. Del mismo modo, en estos sitios web vulnerables, podemos literalmente explorar a través de las bases de datos para extraer información

Prevenir la inyección SQL

La inyección SQL se puede prevenir generalmente mediante el uso de Sentencias Preparadas . Cuando usamos una sentencia preparada, básicamente estamos usando una plantilla para el código y analizando el código y la entrada del usuario por separado. No mezcla la consulta introducida por el usuario y el código. En el ejemplo dado al principio de este artículo, la entrada introducida por el usuario se inserta directamente en el código y se compilan juntos, y por lo tanto somos capaces de ejecutar el código malicioso. Para las sentencias preparadas, básicamente enviamos la consulta sql con un marcador de posición para la entrada del usuario y luego enviamos la entrada real del usuario como un comando separado.
Considere el siguiente segmento de código php.

$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));

En este código, la entrada del usuario no se combina con la sentencia preparada. Se compilan por separado. Así que incluso si el código malicioso se introduce como entrada del usuario, el programa simplemente tratará la parte maliciosa del código como una cadena y no como un comando.

Nota: Esta aplicación es para ser utilizada únicamente con fines de prueba
Artículo relacionado
Inyección SQL básica y mitigación

Referencia:stackoverflow.com

Este artículo es contribuido por Deepak Srivatsav. Si te gusta GeeksforGeeks y quieres contribuir, también puedes escribir un artículo en contribute.geeksforgeeks.org o enviarlo por correo a [email protected]. Verás cómo tu artículo aparece en la página principal de GeeksforGeeks y ayudarás a otros Geeks.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.