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 :

htaccess_credentials

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 :

Schéma requête
Fonctionnement d'une requête HTTP

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 !

Vos réactions (9) :

haliloulah

Tuto bien expliquer merci Lobodol

26/05/2015 à 02:20

bilel

ani bilel

04/03/2016 à 15:13

Marco

Un bon tuto, un faille à prendre en compte. Merci

26/04/2016 à 11:53

Gandoulf Le miroufle

Bonjour,

Tuto simpa mais le script php retourne une page html vide après exécution. J'aurai loupé quelque chose ?

04/07/2016 à 15:39

lobodol

Salut Gandoulf,
Pour que ce script fonctionne, tu dois avoir l'extension curl d'activée (cf doc).
Ensuite, le script ne retourne rien, il créé un fichier "resultat.html" dans lequel est écrit le contenu le page HTML si le hack à réussi.
Ton script a-t-il les droits d'écriture sur le répertoire où il se trouve (cf chmod).
Si tu rencontres encore des difficultés, n'hésite pas à créer un nouveau sujet sur le forum

04/07/2016 à 15:52

gfh

Très bon tuto, comme d'hab, mais j'ai été un peu surpris au début, parce que je ne me souvient pas avoir déjà rencontré ce type d'identification o.O Si ce système a une sécurité faible c'est normal qu'il soit peu utilisé mais là, jamais vu. Vous avez des exemples de sites ?

21/09/2016 à 22:27

lobodol

@gfh : Salut, content que le tuto te plaise :)
La protection par .htaccess est une technique assez répandue (je l'utilise assez souvent dans mon boulot pour des clients). C'est une technique très fiable à partir du moment on n'utilise pas la faille décrite dans l'article.
Mais c'est une technique qui sert seulement à restreindre l'accès à une page/section d'un site, pas à s'authentifier en tant qu'utilisateur.
Là comme ça, je n'ai pas d'exemple à te donner, mais saches que c'est toujours utilisé de nos jours :)

22/09/2016 à 09:26

babeuseu

personnellement le script onctionne tres bien. excellent tuto et merci.
par contre je pense avoir un petit probleme avec la page résultat.html
elle ne contient rien d'autre qu'un 1 dans le document est ce normal?

26/11/2016 à 12:31

lobodol

Salut, rajoute ça dans ton code :


curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

26/11/2016 à 13:03

Vous avez besoin d'aide ? Utilisez le Forum plutôt que les commentaires.

Un commentaire ?

* Champs obligatoires