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

Sécurité

Des plans de permis de construire exposés dans un dossier d’uploads accessible sans authentification

Un cabinet d'architectes stocke des plans confidentiels de projets en cours dans un dossier d'uploads WordPress librement consultable. Comment cette exposition a été découverte et corrigée.

Par WordPress Développement • 28 mars 2022 • 4 min de lecture • Aucun commentaire
Des plans de permis de construire exposés dans un dossier d'uploads accessible sans authentification

340 fichiers PDF de plans de permis de construire, associés à des projets clients en cours et non encore déposés officiellement : c’est ce qu’un cabinet d’architectes a découvert accessible à quiconque connaissait ou devinait leur chemin, sans aucune authentification requise. La cause : un dossier wp-content/uploads recevant, sans distinction, des images destinées au site public et des documents confidentiels destinés à un usage strictement interne.

Le stockage externalisé de gros fichiers (solutions dédiées de partage de documents volumineux) ne fait pas l’objet de cet article : le cabinet utilisait directement le dossier d’uploads natif de WordPress pour stocker ces plans, générés par une extension de gestion de projets clients installée sur leur site, sans avoir mesuré que ce dossier reste, par conception, librement accessible depuis le web dès lors que l’on connaît son chemin exact.

Un comportement par défaut de WordPress souvent mal compris

Le dossier wp-content/uploads n’implémente, en configuration standard, aucun contrôle d’accès basé sur l’identité du visiteur. N’importe quel fichier qui y est déposé devient accessible par son URL directe, indépendamment de la connexion ou non de l’utilisateur au site. Cette conception convient parfaitement à des images de blog ou des documents destinés à être publics ; elle devient un problème dès lors qu’un fichier confidentiel y est stocké par erreur, en pensant que la structure de dossiers, elle-même peu visible, offrira une protection suffisante.

Comment l’exposition a été découverte

L'essentiel à retenir : Un dossier d'uploads est public par défaut sur WordPress ; Un nom de fichier difficile à deviner ne remplace jamais un contrôle d'accès ; La correction passe par un stockage hors racine web

Un membre du cabinet a remarqué, en effectuant une recherche sur son propre nom sur un moteur de recherche, qu’un des fichiers PDF apparaissait indexé, avec un aperçu du contenu visible directement dans les résultats. Ce fichier avait été partagé par lien direct avec un client, sans restriction, et le moteur de recherche l’avait indexé naturellement en suivant ce lien externe, révélant du même coup l’existence du dossier complet.

site:cabinet-exemple.fr filetype:pdf

Cette simple recherche a permis de mesurer l’ampleur réelle de l’exposition : bien au-delà du seul fichier initialement repéré.

La correction : sortir les documents sensibles de la racine web

La solution retenue consiste à déplacer les documents confidentiels en dehors du dossier uploads accessible publiquement, vers un répertoire situé hors de la racine web servie par le serveur, puis à les servir uniquement via un script PHP qui vérifie l’authentification et les droits du visiteur avant d’en livrer le contenu :

function servir_plan_projet( $projet_id ) {
    if ( ! is_user_logged_in() || ! current_user_can( 'voir_projet', $projet_id ) ) {
        wp_die( 'Accès refusé', 403 );
    }

    $chemin = WP_CONTENT_DIR . '/../plans-prives/' . $projet_id . '.pdf';
    header( 'Content-Type: application/pdf' );
    readfile( $chemin );
    exit;
}

Cette fonction, appelée via une route dédiée plutôt qu’une URL directe vers le fichier, garantit qu’aucun document ne peut plus être consulté sans passer par la vérification des droits.

Empêcher l’indexation en attendant la migration complète

Le temps de migrer l’ensemble des documents existants, un fichier robots.txt excluant le dossier concerné, combiné à un en-tête X-Robots-Tag: noindex sur les réponses de ce dossier, a limité une nouvelle indexation le temps que la correction structurelle soit déployée. Ce n’est qu’une mesure provisoire : elle n’empêche pas un accès direct, elle limite seulement l’indexation par les moteurs de recherche.

Auditer les extensions existantes pour éviter la récidive

L’extension de gestion de projets utilisée par le cabinet a depuis été reconfigurée pour écrire systématiquement ses fichiers générés hors du dossier uploads, avec l’accord de son éditeur qui proposait déjà cette option, simplement non activée par défaut.

Un dossier d’uploads WordPress n’a jamais été conçu comme un espace de stockage confidentiel : tout ce qui y est déposé doit être considéré comme potentiellement public, quelle que soit la difficulté apparente à en deviner le chemin.

En résumé

Stocker des documents sensibles dans le dossier d’uploads natif de WordPress, même avec des noms de fichiers peu évidents, revient à compter sur une protection qui n’existe pas. Le vrai correctif consiste à sortir ces fichiers de la racine web et à les servir uniquement à travers une vérification d’authentification et de droits, comme cela aurait dû être fait dès la conception du système.

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