Chemins d'administration par défaut et contournement par verbe HTTP
Beaucoup de serveurs web et de frameworks exposent une interface d’administration sur un chemin prévisible, sans configuration personnalisée. Trouver ce chemin est souvent la première étape. La seconde est d’observer comment le serveur réagit selon le verbe HTTP utilisé — certaines configurations ne protègent que GET ou POST, laissant d’autres verbes sans contrôle d’accès.
Trouver les chemins d’administration
Section titled “Trouver les chemins d’administration”Les chemins à tester en priorité selon la technologie détectée :
# Génériques/admin/administrator/admin.php/admin/login/admin/dashboard/panel/backoffice/manage/management/console/cp # control panel
# PHP/phpmyadmin/pma
# Java / Tomcat/manager/manager/html/host-manager
# Node.js / Express/admin/api/admin
# WordPress/wp-admin/wp-login.php
# Drupal/admin/user/login
# Jenkins/jenkins
# Spring Boot Actuator/actuator/actuator/env/actuator/beansUn outil comme feroxbuster ou gobuster automatise cette énumération :
feroxbuster -u https://exemple.com -w /usr/share/wordlists/dirb/common.txtgobuster dir -u https://exemple.com -w /usr/share/wordlists/dirb/common.txtIdentifier l’authentification Basic
Section titled “Identifier l’authentification Basic”Quand une page d’administration retourne un code 401 Unauthorized, le serveur indique dans les en-têtes de réponse le mécanisme d’authentification attendu :
HTTP/1.1 401 UnauthorizedWWW-Authenticate: Basic realm="Administration"L’authentification HTTP Basic encode les credentials en base64 dans l’en-tête Authorization de la requête :
Authorization: Basic dXNlcjpwYXNzd29yZA==Décoder la valeur base64 pour lire les credentials transmis :
echo "dXNlcjpwYXNzd29yZA==" | base64 -d# → user:passwordEn interceptant la requête dans Burp Suite avec des identifiants aléatoires, l’en-tête Authorization apparaît en clair dans le panneau Proxy. La valeur base64 se décode immédiatement — ce n’est pas du chiffrement.
Le verb tampering
Section titled “Le verb tampering”Un serveur peut protéger un endpoint uniquement pour certains verbes HTTP et laisser les autres sans contrôle d’accès. C’est une erreur de configuration fréquente dans les frameworks qui définissent des règles d’autorisation par verbe.
Verbes HTTP disponibles
Section titled “Verbes HTTP disponibles”GET Lecture d'une ressourcePOST Création ou soumissionPUT Remplacement complet d'une ressourcePATCH Modification partielleDELETE SuppressionHEAD Comme GET mais sans corps de réponseOPTIONS Liste des verbes acceptés par le serveurTRACE Écho de la requête (diagnostic)Tester les verbes avec Burp Repeater
Section titled “Tester les verbes avec Burp Repeater”- Intercepter la requête vers
/admindans Burp Proxy - L’envoyer dans Repeater (
Ctrl+R) - Modifier le verbe HTTP dans le panneau de requête
- Rejouer et observer la réponse
# Requête initiale bloquéeGET /admin HTTP/1.1Host: exemple.com→ 401 Unauthorized
# Même ressource, verbe différentPOST /admin HTTP/1.1Host: exemple.com→ 200 OK
# Ou avec HEAD pour vérifier l'existence sans corps de réponseHEAD /admin HTTP/1.1Host: exemple.com→ 200 OKTester avec curl
Section titled “Tester avec curl”# GET standardcurl -i -X GET https://exemple.com/admin
# Tester POSTcurl -i -X POST https://exemple.com/admin
# Tester d'autres verbescurl -i -X PUT https://exemple.com/admincurl -i -X PATCH https://exemple.com/admincurl -i -X HEAD https://exemple.com/admin
# Découvrir les verbes acceptéscurl -i -X OPTIONS https://exemple.com/admin# Allow: GET, POST, HEAD, OPTIONSExemple de configuration vulnérable
Section titled “Exemple de configuration vulnérable”En Java avec Spring Security, une configuration qui ne couvre pas tous les verbes :
// Configuration vulnérablehttp.authorizeRequests() .antMatchers(HttpMethod.GET, "/admin/**").authenticated() .antMatchers(HttpMethod.POST, "/admin/**").authenticated(); // PUT, DELETE, HEAD non couverts → accessibles sans authEn Apache avec .htaccess :
# Vulnérable : seul GET est protégé<Limit GET> Require valid-user</Limit>Ce qu’on peut faire une fois l’accès obtenu
Section titled “Ce qu’on peut faire une fois l’accès obtenu”Selon ce que le verbe non protégé permet d’atteindre :
- HEAD / OPTIONS : confirmer l’existence d’une ressource, découvrir les verbes acceptés
- GET sans auth : lire le contenu de la page d’administration
- POST sans auth : soumettre des formulaires, créer des ressources
- PUT / PATCH : modifier des ressources existantes
- DELETE : supprimer des entrées
Remédiation
Section titled “Remédiation”Couvrir tous les verbes dans les règles d’autorisation
Section titled “Couvrir tous les verbes dans les règles d’autorisation”// Spring Security — couvrir tous les verbeshttp.authorizeRequests() .antMatchers("/admin/**").authenticated();// Sans restriction par HttpMethod : s'applique à tous les verbes# Apache — utiliser LimitExcept pour couvrir tout ce qui n'est pas explicitement autorisé<LimitExcept GET POST> Require all denied</LimitExcept>Désactiver les verbes inutiles au niveau serveur
Section titled “Désactiver les verbes inutiles au niveau serveur”# Nginx — autoriser uniquement GET et POSTif ($request_method !~ ^(GET|POST)$) { return 405;}Remplacer l’authentification Basic par un mécanisme robuste
Section titled “Remplacer l’authentification Basic par un mécanisme robuste”L’authentification HTTP Basic transmet les credentials encodés en base64 à chaque requête. Base64 n’est pas du chiffrement — la valeur est lisible immédiatement après décodage. En l’absence de TLS, les credentials transitent en clair sur le réseau.
Préférer :
- Des sessions authentifiées avec tokens signés (JWT, sessions serveur)
- De l’OAuth 2.0 pour les interfaces d’administration exposées
- Un VPN ou un accès réseau restreint pour les interfaces internes
À retenir
Section titled “À retenir”Tester les chemins par défaut ne prend pas longtemps et donne des résultats sur des cibles peu configurées. Quand une authentification est trouvée, tester systématiquement les autres verbes HTTP : la protection est souvent partielle et laisse des verbes sans contrôle d’accès.