Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/josejuansanchez/sql-injection
Docker Compose para desplegar la aplicación web DVWA (Damn Vulnerable Web Application) para realizar prácticas de SQL Injection.
https://github.com/josejuansanchez/sql-injection
docker-compose dvwa sql-injection
Last synced: about 5 hours ago
JSON representation
Docker Compose para desplegar la aplicación web DVWA (Damn Vulnerable Web Application) para realizar prácticas de SQL Injection.
- Host: GitHub
- URL: https://github.com/josejuansanchez/sql-injection
- Owner: josejuansanchez
- Created: 2024-04-10T10:13:02.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2024-05-10T19:02:07.000Z (6 months ago)
- Last Synced: 2024-05-11T13:43:49.947Z (6 months ago)
- Topics: docker-compose, dvwa, sql-injection
- Language: PHP
- Homepage: https://josejuansanchez.org/bd
- Size: 1010 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# sql-injection
- [Introducción](#introducción)
- [Cómo desplegar la aplicación](#cómo-desplegar-la-aplicación)
- [Credenciales por defecto](#credenciales-por-defecto)
- [Creación de la base de datos](#creación-de-la-base-de-datos)
- [Configuración del nivel de seguridad](#configuración-del-nivel-de-seguridad)
- [SQL Injection](#sql-injection)
- [Ejemplo 1. Hacer login sin conocer el password](#ejemplo-1-hacer-login-sin-conocer-el-password)
- [Ejemplo 2. Obtener el listado de todos los usuarios](#ejemplo-2-obtener-el-listado-de-todos-los-usuarios)
- [Ejemplo 3. Obtener el listado de todas las tablas de la base de datos](#ejemplo-3-obtener-el-listado-de-todas-las-tablas-de-la-base-de-datos)
- [Ejemplo 4. Obtener las columnas de la tabla `users`](#ejemplo-4-obtener-las-columnas-de-la-tabla-users)
- [Ejemplo 5. Obtener el listado de todos los usuarios y sus contraseñas](#ejemplo-5-obtener-el-listado-de-todos-los-usuarios-y-sus-contraseñas)
- [Blind SQL Injection](#blind-sql-injection)
- [Ejemplo 1](#ejemplo-1)
- [Referencias](#referencias)## Introducción
Este repositorio contiene un archivo `docker-compose.yml` para desplegar la
aplicación [Damn Vulnerable Web Application (DVWA)][1].[DVWA][1] es una aplicación web desarrollada en PHP y MySQL que ha sido diseñada
con algunas de las vulnerabilidad más comunes que pueden aparecer en las
aplicaciones web.Puede encontrar más información en el [repositorio oficial del proyecto DVWA][1].
## Cómo desplegar la aplicación
Para desplegar la aplicación ejecute el comando:
```
docker compose up -d
```Para detener los contenedores:
```
docker compose down
```Para detener los contenedores y eliminar el volumen de la base de datos:
```
docker compose down -v
```## Credenciales por defecto
![](images/00.png)
Las credenciales por defecto para acceder a la aplicación son:
- username: `admin`
- password: `password`## Creación de la base de datos
La primera vez que acceda a la aplicación tendrá que crear la base datos
siguiendo estos pasos:1. Seleccione en el menú principal que aparece a la izquierda la opción `Setup /
Reset DB`.![](images/01.png)
2. Una vez que esté en la página de configuración de la base de datos, pulse
sobre el botón `Create / Reset Database` que aparece al final de la página.![](images/02.png)
Estos pasos puede realizarlos siempre que quiera eliminar la base de datos
actual y volver a crearla con los datos por defecto.## Configuración del nivel de seguridad
La aplicación permite configurar el nivel de seguridad desde el apartado `DVWA
Security` del menú principal.Existen cuatro niveles de seguridad: `Low`, `Medium`, `High` y `Impossible`.
![](images/03.png)
Los ejemplos que se muestran a continuación son para el nivel de seguridad
`Low`.## SQL Injection
De todos los tipos de vulnerabilidades que existen en la aplicación vamos a
centrarnos en las de tipo [SQL Injection][2].### Ejemplo 1. Hacer login sin conocer el password
![](images/04.png)
En este ejemplo vamos a seleccionar la opción `Brute Force` del menú principal,
donde nos aparecerá un formulario con dos campos: `username` y `password`.Al final de la página nos aparece un botón con el texto `View Source` que nos
permite ver el código fuente de la página.En este repositorio se ha incluido el código fuente que utiliza el formulario del ejemplo, para que pueda estudiarlo con detalle. [Ver el código fuente del archivo `brute_source_low.php`](vulnerabilities/brute_source_low.php).
El código fuente que utiliza esta aplicación para recibir los parámetros del
formulario y construir la consulta SQL es el siguiente:```php
// Get username
$user = $_GET[ 'username' ];// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
```Podemos hacer un ataque de tipo _SQL Injection_ introduciendo el siguiente valor
en el campo `username` del formulario:```
admin' #
```Al enviar este valor la cadena con la consulta SQL que se ejecutará en la base
de datos será la siguiente:```SQL
SELECT * FROM `users` WHERE user = 'admin' #' AND password = ...
```Tenga en cuenta que todo lo que aparezca después del carácter `#` será
considerado como un comentario y no se ejecutará.![](images/05.png)
También puede comentar el resto de la consulta utilizando dos guiones **seguidos
de un espacio**, por lo tanto, si enviamos el siguiente valor en el campo
`username` del formulario también podríamos hacer un ataque de tipo SQL
Injection:```
admin' --
```Al enviar este valor la cadena con la consulta SQL que se ejecutará en la base
de datos será la siguiente:```SQL
SELECT * FROM `users` WHERE user = 'admin' -- ' AND password = ...
```![](images/06.png)
## Ejemplo 2. Obtener el listado de todos los usuarios
![](images/07.png)
En este ejemplo vamos a seleccionar la opción `SQL Injection` del menú
principal, donde nos aparecerá un formulario con un campo para introducir el
identificador de un usuario y buscarlo en la base de datos.Al final de la página nos aparece un botón con el texto `View Source` que nos
permite ver el código fuente de la página.En este repositorio se ha incluido el código fuente que utiliza el formulario del ejemplo, para que pueda estudiarlo con detalle. [Ver el código fuente del archivo `brute_source_low.php`](vulnerabilities/sqli_source_low.php).
El código fuente que utiliza esta aplicación para recibir el parámetro del
formulario y construir la consulta SQL es el siguiente:```php
// Get input
$id = $_REQUEST[ 'id' ];
...
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
```Podemos hacer un ataque de tipo _SQL Injection_ para obtener el listado de todos
los usuarios que existen en la base de datos, introduciendo el siguiente valor
en el campo `id` del formulario:```
1' OR 1 = 1 #
```Al enviar este valor la cadena con la consulta SQL que se ejecutará en la base
de datos será la siguiente:```SQL
SELECT first_name, last_name FROM users WHERE user_id = '1' OR 1 = 1 #';
```Tenga en cuenta que todo lo que aparezca después del carácter `#` será
considerado como un comentario y no se ejecutará.![](images/08.png)
### Ejemplo 3. Obtener el listado de todas las tablas de la base de datos
![](images/07.png)
En este ejemplo vamos a continuar con el formulario que aparece en la opción
`SQL Injection` del menú principal, donde nos aparece un campo para introducir
el identificador de un usuario y buscarlo en la base de datos.En este caso vamos a utilizar el opedor `UNION` para ejecutar una nueva consulta
donde vamos a solicitar el listado de todas las tablas de la base de datos de la
aplicación.En MySQL existe una base de datos llamada `information_schema` que contiene
información de todas las bases de datos que existen en el sistema gestor de
bases de datos. Dentro de esta base de datos existe una tabla llamada `tables`
que almacena información sobre todas las tablas que existen en las bases de
datos del servidor.Puede consultar esta información ejecutando la siguiente consulta SQL desde una
consola de MySQL o desde la aplicación web phpMyAdmin que se incluye en el
despliegue de este proyecto.```SQL
SELECT * FROM information_schema.tables;
```
Como la consulta que se ejecta en el código la aplicación devuelve dos columnas,
la nueva consulta que vamos a inyectar después del operador `UNION` también
tiene que devolver dos columnas.Para hacer el ataque de tipo _SQL Injection_ que nos permita obtener el listado
de todas las tablas de la base de datos de la aplicación, introduciremos el
siguiente valor en el campo `id` del formulario:```
' UNION SELECT table_name,NULL FROM information_schema.tables #
```![](images/09.png)
### Ejemplo 4. Obtener las columnas de la tabla `users`
![](images/07.png)
Una vez que hemos obtenido el listado de todas las tablas de la base de datos de
la aplicación, veremos que existe una tabla llamada `users`.Ahora vamos a realizar un ataque de tipo _SQL Injection_ para obtener las
columnas de la tabla `users`.El valor que tendremos que introducir en el campo `id` del formulario es el
siguiente:```
' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name= 'users' #
```![](images/10.png)
### Ejemplo 5. Obtener el listado de todos los usuarios y sus contraseñas
![](images/07.png)
Una vez que hemos consultado cuáles son las columnas de la tabla `users`,
observamos que exsiten dos columnas con los nombres de `user` y `password`.Vamos a realizar un ataque para obtener el listado de todos los usuarios y sus
contraseñas.En este caso, el valor que tendremos que introducir en el campo `id` del
formulario es el siguiente:```
' UNION SELECT user, password FROM users #
```![](images/11.png)
## Blind SQL Injection
El ataque de tipo _Blind SQL Injection_ es una técnica que se utiliza cuando una
aplicación es vulnerable a ataques de tipo SQL Injection pero está configurada
para no mostrar los resultados de las consultas que se le están inyectando.En este caso, el atacante envía consultas SQL a la base de datos de la
aplicación vulnerable y analiza las respuestas para determinar si la consulta es
verdadera o falsa. Aunque el proceso para obtener información es lento, esta
técnica permite a un atacante extraer información de forma indirecta.### Ejemplo 1
![](images/12.png)
En este ejemplo vamos a seleccionar la opción `SQL Injection (Blind)` del menú
principal, donde nos aparecerá un formulario con un campo para introducir el
identificador de un usuario y buscarlo en la base de datos.Para comprobar si la aplicación es vulnerable a un ataque de tipo _Blind SQL
Injection_ vamos a introducir el siguiente valor en el campo `id` del formulario:```
1' OR 1 = 1 #
```En este caso, la aplicación no nos devuelve el listado de todos los usuarios que
existen en la tabla `users`, pero nos devuelve un mensaje de éxito informándonos
que el usuario con el identificador `1` existe en la base de datos. Esto quiere
decir que esta aplicación es vulnerable a un ataque de tipo _Blind SQL
Injection_.![](images/13.png)
## Referencias
- [Repositorio GitHub del proyecto DVWA][1]
- [SQL Injection][2]. Wikipedia.
- [SQL injection cheat sheet][3]. Invicty Security.
- [SQL Injection][4]. OWASP.
- [Blind SQL Injection][6]. OWASP.
- [Bobby Tables: A guide to preventing SQL injection][5][1]: https://github.com/digininja/DVWA
[2]: https://en.wikipedia.org/wiki/SQL_injection
[3]: https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/
[4]: https://owasp.org/www-community/attacks/SQL_Injection
[5]: https://bobby-tables.com
[6]: https://owasp.org/www-community/attacks/Blind_SQL_Injection