Le WordPress d'aujourd'hui, décodé pour les développeurs

Sécurité

Stocker un export de base dans le même dossier que les uploads publics

Un fichier .sql de plusieurs centaines de mégaoctets attendait sagement, indexable et téléchargeable, au milieu des images du site.

Par WordPress Développement • 23 juillet 2023 • 4 min de lecture • Aucun commentaire
Stocker un export de base dans le même dossier que les uploads publics

Le dossier wp-content/uploads/ sert un but précis : rendre des fichiers accessibles publiquement, par conception. Tout ce qui y est déposé devient, sauf configuration serveur contraire, consultable par n’importe quel visiteur connaissant ou devinant son chemin. Un audit d’infrastructure a retrouvé un export complet de base de données stocké précisément à cet endroit.

Le fichier, nommé backup-2023-06-01.sql, pesait 340 Mo et se trouvait dans un sous-dossier daté du dossier uploads, aux côtés des images du mois correspondant. Il contenait l’intégralité des tables du site : contenus, utilisateurs avec leurs mots de passe hachés, clés API stockées en option, commandes WooCommerce avec adresses complètes.

Ce qu’on observe

Le script de sauvegarde, écrit par un précédent prestataire, exécutait un mysqldump planifié via une tâche cron système, puis déposait directement le fichier résultant dans le dossier uploads du site, probablement parce que ce dossier disposait déjà des droits d’écriture nécessaires pour l’utilisateur système exécutant le script.

#!/bin/bash
DATE=$(date +%Y-%m-%d)
mysqldump -u wp_user -p"$DB_PASS" wordpress_db > /var/www/site/wp-content/uploads/2023/06/backup-$DATE.sql

Aucun mécanisme de purge automatique, aucune restriction d’accès au niveau du serveur web, aucune limitation du nom de fichier ne protégeait ce dépôt. Le fichier restait indéfiniment accessible à l’URL directe correspondante, exactement comme n’importe quelle image du même dossier.

Pourquoi c’est un problème

Le dossier uploads n’est protégé par aucune authentification par défaut, ce comportement étant précisément celui recherché pour les médias destinés à être affichés sur le site public. Y placer un fichier qui ne devrait jamais être public revient à contredire directement la fonction du dossier, sans qu’aucune erreur de configuration ne soit nécessaire pour que l’exposition se produise : le comportement par défaut suffit.

  • Le fichier était référencé nulle part dans le site, mais restait consultable par accès direct à l’URL.
  • Des robots d’indexation avaient déjà exploré une partie de l’arborescence datée du dossier.
  • Aucune rotation ni suppression des anciens exports n’était en place, accumulant les fichiers mois après mois.
L'essentiel à retenir : Le dossier uploads est conçu pour être public par défaut ; Un export planifié doit vivre hors de toute racine web accessible ; Un nom de fichier discret ne remplace jamais une restriction d'accès

Quoi faire à la place

La correction ne consiste pas à renommer le fichier ou à le déplacer dans un sous-dossier moins visible : un chemin discret n’est jamais un contrôle d’accès, seulement un obstacle contournable par simple énumération ou indexation. La solution consiste à stocker les exports entièrement hors de toute racine servie par le serveur web.

#!/bin/bash
DATE=$(date +%Y-%m-%d)
DOSSIER_EXPORT=/var/backups/wordpress
mkdir -p "$DOSSIER_EXPORT"
mysqldump -u wp_user -p"$DB_PASS" wordpress_db > "$DOSSIER_EXPORT/backup-$DATE.sql"
# Purge des exports de plus de 30 jours.
find "$DOSSIER_EXPORT" -name "backup-*.sql" -mtime +30 -delete

Le dossier /var/backups/wordpress se situe hors de la racine web /var/www/site, ce qui rend tout accès via une URL structurellement impossible, indépendamment de toute règle de réécriture ou de permission de fichier ajoutée après coup.

Renforcer la défense en profondeur

Au-delà du déplacement du dossier, deux mesures complémentaires ont été ajoutées pour éviter qu’une régression future ne réintroduise le même risque : un blocage explicite au niveau du serveur web de toute extension .sql dans le dossier uploads, et une alerte automatisée en cas de détection d’un tel fichier.

MesureEffet
Export hors racine webÉlimine l’accès direct par construction
Blocage des .sql dans uploadsFilet de sécurité en cas de script mal configuré
Purge automatique après 30 joursRéduit la fenêtre d’exposition en cas d’oubli

Repère retenu de cet audit : si un fichier ne doit être consulté par personne d’autre que l’administrateur système, sa place n’est jamais dans un dossier conçu pour être public, quel que soit le nom qu’on lui donne.

En résumé

Ce défaut ne provient d’aucune faille logicielle : il provient d’un choix d’emplacement de fichier, motivé par la simplicité d’écriture plutôt que par une réflexion sur la visibilité résultante. Le sujet de la stratégie de sauvegarde elle-même — fréquence, rétention, chiffrement — relève d’une réflexion distincte, traitée côté hébergement ; celui-ci porte uniquement sur l’emplacement où un export, quel qu’il soit, ne doit jamais résider.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi