Este artículo explica cómo probar si un sitio web está a salvo de la inyección SQL utilizando la herramienta de prueba de penetración SQLMAP.
¿Qué es la inyección SQL?
SQL Injection es una técnica de inyección de código en la que un atacante ejecuta consultas SQL maliciosas que controlan la base de datos de una aplicación web. Con el conjunto correcto de consultas, un usuario puede obtener acceso a la información almacenada en las bases de datos. SQLMAP prueba si un parámetro ‘GET’ es vulnerable a la inyección de SQL.
Por ejemplo, considere el siguiente segmento de código php:
$variable = $_POST['input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Si el usuario ingresa “valor’); DROP TABLE table;–” como entrada, la consulta se convierte en
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
lo cual 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á ingresar una consulta sql requerida para manipular la base de datos.
¿Dónde puedes usar SQLMAP?
Si observa una URL web que tiene el formato 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 obtener acceso a la información en la base de datos. Además, SQLMAP funciona cuando está basado en php.
Una prueba simple para verificar si su sitio web es vulnerable sería reemplazar el valor en el parámetro de solicitud de obtención con un asterisco (*). Por ejemplo,
http://testphp.vulnweb.com/listproducts.php?cat=*
Si esto da como resultado un error como el anterior, entonces podemos decir de manera concluyente que el sitio web es vulnerable.
Instalando sqlmap
SQLMAP viene preinstalado con kali linux, que es la opción preferida de la mayoría de los probadores de penetración. Sin embargo, puede instalar sqlmap en otros sistemas Linux basados en Debian usando el comando
sudo apt-get install sqlmap
Uso
En este artículo, haremos uso de un sitio web que está diseñado con vulnerabilidades con fines de demostración:
http://testphp.vulnweb.com/listproducts.php?cat=1
Como puede ver, hay un parámetro de solicitud GET (cat = 1) que el usuario puede cambiar modificando el valor de cat. Por lo tanto, este sitio web podría ser vulnerable a una inyección SQL de este tipo.
Para probar esto, usamos SQLMAP. Para ver el conjunto de parámetros que se pueden pasar, escriba en la terminal,
sqlmap -h
Los parámetros que usaremos para la inyección SQL básica se muestran en la imagen de arriba. Junto con estos, también usaremos el parámetro –dbs y -u, cuyo uso se explicó en el Paso 1.
Uso de SQLMAP para probar un sitio web en busca de una vulnerabilidad de inyección SQL:
- Paso 1: Enumere información sobre las bases de datos existentes
Primero, debemos ingresar la URL web que queremos verificar junto con el parámetro -u. También podemos usar el parámetro –tor si deseamos probar el sitio web usando proxies. Ahora, por lo general, nos gustaría probar si es posible obtener acceso a una base de datos. Así que usamos la opción –dbs para hacerlo. –dbs enumera todas las bases de datos disponibles.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
- Obtenemos el siguiente resultado que nos muestra que hay dos bases de datos disponibles. A veces, la aplicación le dirá que ha identificado la base de datos y le preguntará si desea probar otros tipos de bases de datos. Puede continuar y escribir ‘Y’. Además, puede preguntarle si desea probar otros parámetros en busca de vulnerabilidades, escriba ‘Y’ aquí ya que queremos probar a fondo la aplicación web.
- Observamos que hay dos bases de datos, acuart e information_schema
- Paso 2: Enumere la información sobre las tablas presentes en una base de datos en particular
. Para intentar acceder a cualquiera de las bases de datos, debemos modificar ligeramente nuestro comando. Ahora usamos -D para especificar el nombre de la base de datos a la que deseamos acceder, y una vez que tengamos acceso a la base de datos, nos gustaría ver si podemos acceder a las tablas. Para esto, usamos la consulta –tables. Accedamos a la base de datos de acuart.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
-
En la imagen de arriba, vemos que se han recuperado 8 tablas. Así que ahora sabemos definitivamente que el sitio web es vulnerable.
- Paso 3: Enumere 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
- Paso 4: volcar los datos de las columnas
De manera similar, podemos acceder a la información en una columna específica usando el siguiente comando, donde -C se puede usar para especificar el nombre de varias columnas separadas por una coma, y la consulta de volcado recupera los datos
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists -C aname --dump
- En la imagen de arriba, podemos ver que hemos accedido a los datos de la base de datos. Del mismo modo, en sitios web tan vulnerables, podemos literalmente explorar a través de las bases de datos para extraer información.
Prevenir la inyección de SQL
La inyección SQL generalmente se puede evitar mediante el uso de declaraciones preparadas . Cuando usamos una declaración 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 ingresada por el usuario y el código. En el ejemplo dado al comienzo de este artículo, la entrada ingresada por el usuario se inserta directamente en el código y se compilan juntos, y por lo tanto podemos ejecutar código malicioso. Para declaraciones preparadas, básicamente enviamos la consulta sql con un marcador de posición para la entrada del usuario y luego enviamos la entrada del usuario real 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 declaración preparada. Se recopilan por separado. Entonces, incluso si se ingresa un código malicioso como entrada del usuario, el programa simplemente tratará la parte maliciosa del código como una string y no como un comando.
Nota: esta aplicación debe usarse únicamente con fines de prueba
Artículo relacionado
Inyección y mitigación de SQL básico
Referencia: stackoverflow.com
Este artículo es una contribución de Deepak Srivatsav . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA