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:
- 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.
- 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.
- 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
- 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 datossqlmap -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.