{"id":21016276,"url":"https://github.com/josejuansanchez/sql-injection","last_synced_at":"2025-07-28T23:38:20.987Z","repository":{"id":232610706,"uuid":"784670671","full_name":"josejuansanchez/sql-injection","owner":"josejuansanchez","description":"Docker Compose para desplegar la aplicación web DVWA (Damn Vulnerable Web Application) para realizar prácticas de SQL Injection.","archived":false,"fork":false,"pushed_at":"2024-05-10T19:02:07.000Z","size":1036,"stargazers_count":6,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-12T09:43:40.187Z","etag":null,"topics":["docker-compose","dvwa","sql-injection"],"latest_commit_sha":null,"homepage":"https://josejuansanchez.org/bd","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/josejuansanchez.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-10T10:13:02.000Z","updated_at":"2024-12-08T01:59:57.000Z","dependencies_parsed_at":"2024-05-10T13:43:02.514Z","dependency_job_id":"7e703a4e-d0a1-4831-82d4-5bb6b5156d18","html_url":"https://github.com/josejuansanchez/sql-injection","commit_stats":null,"previous_names":["josejuansanchez/dvwa-docker-compose"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/josejuansanchez/sql-injection","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josejuansanchez%2Fsql-injection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josejuansanchez%2Fsql-injection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josejuansanchez%2Fsql-injection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josejuansanchez%2Fsql-injection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/josejuansanchez","download_url":"https://codeload.github.com/josejuansanchez/sql-injection/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josejuansanchez%2Fsql-injection/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267604688,"owners_count":24114546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker-compose","dvwa","sql-injection"],"created_at":"2024-11-19T10:12:46.974Z","updated_at":"2025-07-28T23:38:20.971Z","avatar_url":"https://github.com/josejuansanchez.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sql-injection\n\n- [Introducción](#introducción)\n- [Cómo desplegar la aplicación](#cómo-desplegar-la-aplicación)\n- [Credenciales por defecto](#credenciales-por-defecto)\n- [Creación de la base de datos](#creación-de-la-base-de-datos)\n- [Configuración del nivel de seguridad](#configuración-del-nivel-de-seguridad)\n- [SQL Injection](#sql-injection)\n  - [Ejemplo 1. Hacer login sin conocer el password](#ejemplo-1-hacer-login-sin-conocer-el-password)\n  - [Ejemplo 2. Obtener el listado de todos los usuarios](#ejemplo-2-obtener-el-listado-de-todos-los-usuarios)\n  - [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)\n  - [Ejemplo 4. Obtener las columnas de la tabla `users`](#ejemplo-4-obtener-las-columnas-de-la-tabla-users)\n  - [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)\n- [Blind SQL Injection](#blind-sql-injection)\n  - [Ejemplo 1](#ejemplo-1)\n- [Referencias](#referencias)\n\n## Introducción\n\nEste repositorio contiene un archivo `docker-compose.yml` para desplegar la\naplicación [Damn Vulnerable Web Application (DVWA)][1].\n\n[DVWA][1] es una aplicación web desarrollada en PHP y MySQL que ha sido diseñada\ncon algunas de las vulnerabilidad más comunes que pueden aparecer en las\naplicaciones web.\n\nPuede encontrar más información en el [repositorio oficial del proyecto DVWA][1].\n\n## Cómo desplegar la aplicación\n\nPara desplegar la aplicación ejecute el comando:\n\n```\ndocker compose up -d\n```\n\nPara detener los contenedores:\n\n```\ndocker compose down\n```\n\nPara detener los contenedores y eliminar el volumen de la base de datos:\n\n```\ndocker compose down -v\n```\n\n## Credenciales por defecto\n\n![](images/00.png)\n\nLas credenciales por defecto para acceder a la aplicación son:\n\n- username: `admin`\n- password: `password`\n\n\n## Creación de la base de datos\n\nLa primera vez que acceda a la aplicación tendrá que crear la base datos\nsiguiendo estos pasos:\n\n1. Seleccione en el menú principal que aparece a la izquierda la opción `Setup /\nReset DB`. \n\n![](images/01.png)\n\n2. Una vez que esté en la página de configuración de la base de datos, pulse\n   sobre el botón `Create / Reset Database` que aparece al final de la página.\n\n![](images/02.png)\n\nEstos pasos puede realizarlos siempre que quiera eliminar la base de datos\nactual y volver a crearla con los datos por defecto.\n\n## Configuración del nivel de seguridad\n\nLa aplicación permite configurar el nivel de seguridad desde el apartado `DVWA\nSecurity` del menú principal.\n\nExisten cuatro niveles de seguridad: `Low`, `Medium`, `High` y `Impossible`.\n\n![](images/03.png)\n\nLos ejemplos que se muestran a continuación son para el nivel de seguridad\n`Low`.\n\n## SQL Injection\n\nDe todos los tipos de vulnerabilidades que existen en la aplicación vamos a\ncentrarnos en las de tipo [SQL Injection][2].\n\n### Ejemplo 1. Hacer login sin conocer el password\n\n![](images/04.png)\n\nEn este ejemplo vamos a seleccionar la opción `Brute Force` del menú principal,\ndonde nos aparecerá un formulario con dos campos: `username` y `password`.\n\nAl final de la página nos aparece un botón con el texto `View Source` que nos\npermite ver el código fuente de la página.\n\nEn 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). \n\nEl código fuente que utiliza esta aplicación para recibir los parámetros del\nformulario y construir la consulta SQL es el siguiente:\n\n```php\n// Get username\n$user = $_GET[ 'username' ];\n\n// Get password\n$pass = $_GET[ 'password' ];\n$pass = md5( $pass );\n\n$query  = \"SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';\";\n```\n\nPodemos hacer un ataque de tipo _SQL Injection_ introduciendo el siguiente valor\nen el campo `username` del formulario:\n\n```\nadmin' #\n```\n\nAl enviar este valor la cadena con la consulta SQL que se ejecutará en la base\nde datos será la siguiente:\n\n```SQL\nSELECT * FROM `users` WHERE user = 'admin' #' AND password = ...\n```\n\nTenga en cuenta que todo lo que aparezca después del carácter `#` será\nconsiderado como un comentario y no se ejecutará.\n\n![](images/05.png)\n\nTambién puede comentar el resto de la consulta utilizando dos guiones **seguidos\nde un espacio**, por lo tanto, si enviamos el siguiente valor en el campo\n`username` del formulario también podríamos hacer un ataque de tipo SQL\nInjection:\n\n```\nadmin' -- \n```\n\nAl enviar este valor la cadena con la consulta SQL que se ejecutará en la base\nde datos será la siguiente:\n\n```SQL\nSELECT * FROM `users` WHERE user = 'admin' -- ' AND password = ...\n```\n\n![](images/06.png)\n\n## Ejemplo 2. Obtener el listado de todos los usuarios\n\n![](images/07.png)\n\nEn este ejemplo vamos a seleccionar la opción `SQL Injection` del menú\nprincipal, donde nos aparecerá un formulario con un campo para introducir el\nidentificador de un usuario y buscarlo en la base de datos.\n\nAl final de la página nos aparece un botón con el texto `View Source` que nos\npermite ver el código fuente de la página.\n\nEn 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).\n\nEl código fuente que utiliza esta aplicación para recibir el parámetro del\nformulario y construir la consulta SQL es el siguiente:\n\n```php\n// Get input\n$id = $_REQUEST[ 'id' ];\n...\n$query  = \"SELECT first_name, last_name FROM users WHERE user_id = '$id';\";\n```\n\nPodemos hacer un ataque de tipo _SQL Injection_ para obtener el listado de todos\nlos usuarios que existen en la base de datos, introduciendo el siguiente valor\nen el campo `id` del formulario:\n\n```\n1' OR 1 = 1 #\n```\n\nAl enviar este valor la cadena con la consulta SQL que se ejecutará en la base\nde datos será la siguiente:\n\n```SQL\nSELECT first_name, last_name FROM users WHERE user_id = '1' OR 1 = 1 #';\n```\n\nTenga en cuenta que todo lo que aparezca después del carácter `#` será\nconsiderado como un comentario y no se ejecutará.\n\n![](images/08.png)\n\n### Ejemplo 3. Obtener el listado de todas las tablas de la base de datos\n\n![](images/07.png)\n\nEn este ejemplo vamos a continuar con el formulario que aparece en la opción\n`SQL Injection` del menú principal, donde nos aparece un campo para introducir\nel identificador de un usuario y buscarlo en la base de datos.\n\nEn este caso vamos a utilizar el opedor `UNION` para ejecutar una nueva consulta\ndonde vamos a solicitar el listado de todas las tablas de la base de datos de la\naplicación.\n\nEn MySQL existe una base de datos llamada `information_schema` que contiene\ninformación de todas las bases de datos que existen en el sistema gestor de\nbases de datos. Dentro de esta base de datos existe una tabla llamada `tables`\nque almacena información sobre todas las tablas que existen en las bases de\ndatos del servidor.\n\nPuede consultar esta información ejecutando la siguiente consulta SQL desde una\nconsola de MySQL o desde la aplicación web phpMyAdmin que se incluye en el\ndespliegue de este proyecto.\n\n```SQL\nSELECT * FROM information_schema.tables;\n```\nComo la consulta que se ejecta en el código la aplicación devuelve dos columnas,\nla nueva consulta que vamos a inyectar después del operador `UNION` también\ntiene que devolver dos columnas.\n\nPara hacer el ataque de tipo _SQL Injection_ que nos permita obtener el listado\nde todas las tablas de la base de datos de la aplicación, introduciremos el\nsiguiente valor en el campo `id` del formulario:\n\n```\n' UNION SELECT table_name,NULL FROM information_schema.tables #\n```\n\n![](images/09.png)\n\n### Ejemplo 4. Obtener las columnas de la tabla `users`\n\n![](images/07.png)\n\nUna vez que hemos obtenido el listado de todas las tablas de la base de datos de\nla aplicación, veremos que existe una tabla llamada `users`.\n\nAhora vamos a realizar un ataque de tipo _SQL Injection_ para obtener las\ncolumnas de la tabla `users`.\n\nEl valor que tendremos que introducir en el campo `id` del formulario es el\nsiguiente:\n\n```\n' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name= 'users' #\n```\n\n![](images/10.png)\n\n### Ejemplo 5. Obtener el listado de todos los usuarios y sus contraseñas\n\n![](images/07.png)\n\nUna vez que hemos consultado cuáles son las columnas de la tabla `users`,\nobservamos que exsiten dos columnas con los nombres de `user` y `password`.\n\nVamos a realizar un ataque para obtener el listado de todos los usuarios y sus\ncontraseñas.\n\nEn este caso, el valor que tendremos que introducir en el campo `id` del\nformulario es el siguiente:\n\n```\n' UNION SELECT user, password FROM users #\n```\n\n![](images/11.png)\n\n## Blind SQL Injection\n\nEl ataque de tipo _Blind SQL Injection_ es una técnica que se utiliza cuando una\naplicación es vulnerable a ataques de tipo SQL Injection pero está configurada\npara no mostrar los resultados de las consultas que se le están inyectando.\n\nEn este caso, el atacante envía consultas SQL a la base de datos de la\naplicación vulnerable y analiza las respuestas para determinar si la consulta es\nverdadera o falsa. Aunque el proceso para obtener información es lento, esta\ntécnica permite a un atacante extraer información de forma indirecta.\n\n### Ejemplo 1\n\n![](images/12.png)\n\nEn este ejemplo vamos a seleccionar la opción `SQL Injection (Blind)` del menú\nprincipal, donde nos aparecerá un formulario con un campo para introducir el\nidentificador de un usuario y buscarlo en la base de datos.\n\nPara comprobar si la aplicación es vulnerable a un ataque de tipo _Blind SQL\nInjection_ vamos a introducir el siguiente valor en el campo `id` del formulario:\n\n```\n1' OR 1 = 1 #\n```\n\nEn este caso, la aplicación no nos devuelve el listado de todos los usuarios que\nexisten en la tabla `users`, pero nos devuelve un mensaje de éxito informándonos\nque el usuario con el identificador `1` existe en la base de datos. Esto quiere\ndecir que esta aplicación es vulnerable a un ataque de tipo _Blind SQL\nInjection_.\n\n![](images/13.png)\n\n## Referencias\n\n- [Repositorio GitHub del proyecto DVWA][1]\n- [SQL Injection][2]. Wikipedia.\n- [SQL injection cheat sheet][3]. Invicty Security.\n- [SQL Injection][4]. OWASP.\n- [Blind SQL Injection][6]. OWASP.\n- [Bobby Tables: A guide to preventing SQL injection][5]\n\n\n[1]: https://github.com/digininja/DVWA\n[2]: https://en.wikipedia.org/wiki/SQL_injection\n[3]: https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/\n[4]: https://owasp.org/www-community/attacks/SQL_Injection\n[5]: https://bobby-tables.com \n[6]: https://owasp.org/www-community/attacks/Blind_SQL_Injection","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosejuansanchez%2Fsql-injection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjosejuansanchez%2Fsql-injection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosejuansanchez%2Fsql-injection/lists"}