¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo corregir una inyección SQL

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de contenedores9 min de lectura6 comandos

Qué vas a hacer

La inyección SQL ocurre cuando un programa construye una consulta (una pregunta a la base de datos) pegando en ella lo que ha escrito un visitante. Así, el visitante puede cortar la consulta antes de tiempo y escribir la suya. Vas a buscar en una tienda pequeña, hacer que su página de búsqueda entregue cosas que no debería, corregir la única línea de código que lo permite y demostrar que el ataque ya no funciona.

La única regla

Advertencia

Este laboratorio ejecuta una web insegura a propósito. Ataca esa web y nada más. Es tu copia privada, sin salida a internet, así que no puede afectar a nadie más. No pruebes nunca estas técnicas en una web que no sea tuya: en el Reino Unido es un delito según la ley británica Computer Misuse Act 1990 (Ley de Uso Indebido de Ordenadores de 1990).

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra superior de esta lección y espera hasta que diga que está en marcha. La tienda es el servicio llamado app, y el terminal llega a ella por ese nombre. Cada botón Ejecutar de más abajo escribe su comando en el terminal de tu laboratorio, uno detrás de otro y en la misma sesión. Para ver los comandos en directo, o para escribir los tuyos, pulsa Abrir el terminal (pestaña nueva) en la barra.

1. Busca en la tienda

La búsqueda de la tienda es una dirección web. curl -s la pide, y -G --data-urlencode pone lo que buscas detrás de la dirección, con las comillas y los espacios convertidos en algo seguro. Si buscas pen (bolígrafo), muestra una línea, Pen 1.2: el nombre y el precio.

Comando
curl -s -G --data-urlencode "q=pen" http://app:8000/search

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

2. Sal de la consulta

Dentro del programa, lo que buscas queda pegado entre dos comillas. Una comilla en tu búsqueda las cierra antes de tiempo, OR 1=1 es cierto para todas las filas, y -- convierte el resto de la consulta en un comentario. La tienda lista siete productos, entre ellos Staff discount card y Unreleased drone, que no están a la venta y nunca deberían mostrarse. El mismo truco con UNION SELECT puede pedir otra tabla distinta. Pruébalo tú: la tienda tiene una tabla users.

Comando
curl -s -G --data-urlencode "q=x' OR 1=1 --" http://app:8000/search

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

3. Corrige la línea

El programa está en el contenedor, y la línea débil es la que empieza por rows =. Une tu búsqueda a la consulta con +. Una consulta parametrizada envía a la base de datos la consulta y tu búsqueda por separado, así que lo que escribiste solo puede ser un valor y nunca parte de la consulta. El ? marca dónde va el valor, y la búsqueda se pasa a su lado. Para hacerlo a mano, abre el programa con docker exec -it app vi /tmp/app/app.py y sustituye esa línea (i para escribir, Esc y luego :wq para guardar). El siguiente comando hace el mismo cambio por ti, con esta línea:

rows = db.execute("SELECT name, price FROM products WHERE public = 1 AND name LIKE ?", ("%" + term + "%",)).fetchall()

4. Haz el cambio y reinicia

Esto sustituye esa única línea. La tienda lee su programa una sola vez, al arrancar, así que docker restart pone en marcha la versión nueva. Tarda unos diez segundos y luego muestra app: si el recuadro del comando sigue marcando que se está ejecutando, espera a ver app en el terminal antes de continuar.

Comando
docker exec app sed -i 's|^    rows = .*|    rows = db.execute("SELECT name, price FROM products WHERE public = 1 AND name LIKE ?", ("%" + term + "%",)).fetchall()|' /tmp/app/app.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
docker restart app

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

5. Ataca otra vez

El mismo ataque del paso 2 ahora no muestra nada: la base de datos buscó un producto cuyo nombre contuviera todo x' OR 1=1 --, y no hay ninguno.

Comando
curl -s -G --data-urlencode "q=x' OR 1=1 --" http://app:8000/search

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

6. Comprueba que el uso normal sigue funcionando

Una corrección que rompe la tienda no es una corrección. lab-check prueba una búsqueda normal, una búsqueda de Baker's (un producto con una comilla en el nombre, que hacía fallar el programa débil con un error de base de datos), el OR y el UNION, y muestra PASS o FAIL en cada una. Las cuatro dicen PASS y la última línea es All checks pass. Pulsa Detener el laboratorio y luego Iniciar el laboratorio en la barra del laboratorio y vuelve a ejecutarlo: tu corrección sigue ahí, porque el programa vive en un volumen con nombre y la plataforma guarda los volúmenes.

Comando
docker exec app sh /tmp/app/lab-check

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para el profesorado

Consejo

Esta lección es un pequeño ejemplo de una lección practicada en un laboratorio: los pasos y los botones Ejecutar son la lección, y el laboratorio es la copia propia de cada alumno. Aquí nada se corrige automáticamente: el alumno entrega el ataque antes y después, el último lab-check y la línea que cambió, con su propia frase sobre por qué ahora es segura, y usted evalúa las evidencias. Cópiela en su propio módulo y modifíquela, o cree una desde cero con el menú Laboratorio del constructor de lecciones.

Sobre este laboratorio y su código: Laboratorio de inyección SQL: ataca una búsqueda débil, corrige la consulta y demuéstralo

¿Enseñas a una clase? Asigna estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.