Bypass .htaccess : contourner un accès web sécurisé
Bonjour à tous, aujourd'hui je vais vous présenter commenter exploiter une faille Apache afin de contourner un accès sécurisé à une page web par mot de passe de type htaccess.
Bien que cette faille soit ancienne, je rédige ce tutoriel dans un but ludique afin de vous sensibiliser aux bonne pratiques de développement
Pour bien illustrer la chose, essayez d'accéder à cette page : page sécurisée.
Vous pouvez constater qu'une pop-up apparait vous demandant de saisir un nom d'utilisateur et un mot de passe pour accéder au contenu de la page :
Voici donc comment se présente un accès sécurisé par htaccess.
Mais avant de nous lancer dans l'exploitation de cette faille, essayons de comprendre ce qui se passe.
1. Les fichiers .htaccess et .htpasswd
Les fichiers .htaccess sont des fichiers texte de configuration des serveurs web Apache et peuvent être placés dans n'importe quel répertoire. Ils servent, entre autre, à définir les règles de redirection d'url, de réécriture d'url et, dans le cas qui nous intéresse, à définir les autorisations d'accès à certaines url ou fichiers du serveur.
Voici un exemple de contenu de fichier .htaccess qui nous servira de support pour ce tuto :
AuthName "Private area - superadmin only" # Message à afficher à l'utilisateur
AuthUserFile /home/www/pageSecrete/.htpasswd
AuthGroupFile /dev/null # Définit le nom du fichier texte contenant la liste des groupes d'utilisateurs destinée à servir de base à l'authentification d'accès
AuthType Basic # Cette directive selectionne le type d'authentification pour un répertoire. Seul le type Basic est actuellement implémenté
<Limit GET POST>
require valid-user
</Limit>
On est censés comprendre ce charabia ?
Pas de panique, j'ai commenté les parties simples, nous allons décortiquer le reste :)
Tout d'abord, la ligne 2 :
AuthUserFile /home/www/pageSecrete/.htpasswd
Cette ligne sert à indiquer où se situe le fichier .htpasswd qui contient les identifiants de connexion. Voici à quoi resemble son contenu :
superadmin:$apr1$ZdHH1.Zd$eFnICcA6UA5sQcrpFO0kX.
Comme vous pouvez le voir, le mot de passe est crypté, il est donc impossible de l'exploiter à la seule lecture du fichier, heureusement d'ailleurs !
Nous arrivons maintenant à la partie intéressante :
<Limit GET POST>
require valid-user
</Limit>
Tout d'abord require valid-user
: tout utilisateur reconnu (donc avec le bon username/password) peut accéder au répertoire.
Enfin, les clauses <Limit>
et </Limit>
sont utilisées pour "encapsuler" la directives de contrôle d'accès et ne s'appliquant qu'aux méthodes d'accès HTTP spécifiées par méthode. Traduit simplement, ça veut dire ici que seules les méthodes GET et POST sont autorisées.
Pour plus d'infos sur l'utilisation des fichiers .htaccess, je vous renvoie vers un cours d'Openclassroom qui est très bien écrit.
C'est quoi concrètement une "méthode" ?
Dans le cas présent, une méthode est un verbe que vous spécifiez lorsque vous voulez accéder à une URL. Lorsque vous accédez à www.google.fr via votre navigateur, par défaut il s'agit d'une méthode GET. Il en existe d'autres telles que POST, PUT, DELETE ou encore OPTIONS.
Si on caricature la situation avec notre .htaccess, voici comment ça se passe :
2. Exploitation de la faille
On a vu précédemment que la clause <Limit>
servait à limiter les méthodes d'accès à celles spécifiées, mais que se passe-t-il si on utilise une méthode non listée voir complètement exotique ? Eh bien la directive require valid-user
n'est pas interprétée et le contrôle de sécurité n'est pas fait !
Ainsi, si je tente d'accéder à la page avec une méthode TOTO par exemple, aucun username/password ne me sera demandé et la page sera affichée sans broncher.
D'accord mais heu... comment on fait concrètement pour utiliser ta méthode TOTO ?
En tant que développeur PHP aguerri, la solution que je vous propose aujourd'hui est un petit script PHP très simple. Il faudra bien entendu avoir PHP d'installé avec la librairie curl pour l'exécuter.
<?php
$url = 'http://www.url-securisee.com/superadmin';
$ch = curl_init($url);
$options = array(CURLOPT_CUSTOMREQUEST => 'TOTO');
curl_setopt_array($ch, $options);
$res = curl_exec($ch);
file_put_contents('resultat.html', print_r($res, true));
?>
Si vous passez par un proxy, pensez à le renseigner dans les options de curl. Vous trouverez la doc de cette librairie sur php.net.
Vous n'avez plus qu'à exécuter ce script en ligne de commande (ou directement dans un navigateur si vous avez un serveur Apache qui tourne) :
php monScript.php
Vous verrez alors qu'un fichier 'resultat.html' a été généré dans le répertoire du script et qu'il contient le code HTML de la page sécurisée :)
Sachez qu'il existe des add-on Firefox permettant de modifier les requêtes des URL (Tamper Data ou Live HTTP Headers), ce qui vous permet d'afficher la page sécurisée directement dans votre navigateur. Cependant, c'est toujours plus intéressant de faire les choses par soi même et de comprendre ce qu'on fait, c'est pourquoi je vous propose une solution en PHP.
D'accord, on sait expoiter cette faille mais comment faire pour s'en protéger ?
Tout simplement en n'utilisant PAS les closes <Limit>
qu'on peut voir dans le fichier .htaccess en début du tuto. Ainsi, le code du fichier devient le suivant :
AuthName "Private area - superadmin only"
AuthUserFile /home/www/pageSecrete2/.htpasswd
AuthGroupFile /dev/null
AuthType Basic
# Ici, on n'utilise PAS la clause <Limit>
require valid-user
Si vous avez quand même besoin de limiter les méthodes d'accès, utilisez <LimitExcept>
au lieu de <Limit>
, ce qui génèrera une Exception au lieu d'autoriser l'accès. Documentation Apache.
Allez-y, essayer d'accéder à cette page avec la technique que nous avons vue : page sécurisée.
Vous obtenez une erreur, l'accès est véritablement sécurisé :)
Voilà, c'est tout pour ce tutoriel, j'espère qu'il vous aura plu et que plus personne n'utilisera de clause <Limit>
pour sécuriser ses pages d'administration !
Autres articles dans la catégorie Informatique :
Vos réactions (0) :
- Sois le/la premier(e) à commenter cet article !