La redirection en PHP

Il est parfois nécessaire de rediriger un utilisateur sur une page web lorsque certains critères ne sont pas satisfaits, pour cela on utilise la fonction php header() . Comme son nom l’indique elle permet d’ajouter une en-tête à la réponse HTTP du serveur. Dans notre cas nous devons utiliser l’en-tête Location qui indique au navigateur de rediriger l’utilisateur vers l’URL spécifiée.

Cependant il manque quelque chose à ce code. Notre utilisateur va bien être redirigé mais le script PHP va continuer de s’exécuter et envoyer les données à l’utilisateur mais sans que celui si le sache. Pour bloquer la suite de l’exécution du script il faut le préciser via cette fonction

Le script s’arrête net maintenant, on n’aura donc pas accès aux informations renvoyées par celui-ci.

 

On va maintenant passer à l’exploitation de cette faille. Je vais vous présenter des logiciels, addons et même de simple ligne de commande qui permettent de récupérer l’output ! J’utiliserais le script php vulnérable suivant pour les démo:

 

 

0x01 En ligne de commande

Avec cURL, une bibliothèque spécialisée dans les requêtes URL et qui possède une interface en ligne de commande. Vous pouvez donc l’utiliser via un langage de programmation ou simplement depuis le terminal. Ici depuis Kali (-v pour verbeux)

Le résultat parle de lui même.

 

 

cURL nous renvoie les headers HTTP de la réponse du serveur c’est pour cela que l’on voit bien le Location: http://google.fr. Comme vous le voyez il y a bien le P4SSW0RD car PHP continue l’exécution de la page. Placez le exit(); après le header(); et le password ne sera pas affiché.

Netcat nous permet le permet également. Pour ceux qui ne connaisse pas, netcat est un utilitaire réseaux qui permet entre autre d’ouvrir desport, de faire du scan de port, forger des requêtes… Forgeons maintenant !

  • On utilise l’option -e pour bien interpréter les caractères \n et \r nécessaires à la pour la compréhension des header HTTP
  • On crée une requête GET vers la page /iamswitch/redirect.php de l’hôte 192.168.1.72
  • On pipe le tout, c’est à dire que l’on passe en paramètre de netcat la sortie de la commande echo qui est notre requête HTTP
  • On ouvre la connexion grâce à Netcat vers notre hote via le port 80

 

Il existe également une méthode sous Telnet mais je ne souhaite pas en parler ici car je n’apprécie que moyennement Telnet

 

 

0x02 Grâce à des logiciels

Vous devez surement connaître Wireshark précédemment nommé Ethereal le célèbre analyseur de paquet réseaux. J’affectionne énormément cet outil du fait de sa grande polyvalence, je l’utilise énormément pour débugger mon application Android par exemple. On va pouvoir l’utiliser pour récupérer le paquet contenant la réponse de notre serveur.

Il suffit alors de se rendre sur la page web et de récupérer la réponse du serveur via Wireshark

 

Il y a 4 paquets qui nous intéressent

  1. n°16 : Notre demande de page web
  2. n°17 : La réponse du serveur (contenant le P4SSW0RD)
  3. n°29: Vu que l’on est rédirigé on demande la page web à www.google.fr
  4. n°33 : La réponse du serveur de Google.

En ouvrant la réponse de notre serveur on voit bien que le script a continué à se dérouler.

Il existe également la Burp Suite cet utilitaire écrit en Java (cela explique l’interface graphique douteuse ahah) qui permet de nombreuse chose comme simuler les requêtes web intercépetées à travers un poxy local. En gros les requêtes du navigateur web sont envoyées au proxy (il faut configurer le navigateur de la sorte) une fois interceptées celles ci ont la possibilitées d’être drop, d’être forward ou alors d’être envoyées au Repeater de Burp en cliquant sur Action.

 

Dans le repeater Burp va se charger de re envoyer la requête pour récupérer la réponse sans passer par le navigateur web.

 

 

Burp est vraiment puissant il permet de faire des modifications à la volée, je n’ai pas encore eu l’occasion de l’explorer de fond en comble.

 

 

0x03 Autres méthodes

Il existe divers module Firefox ou Chrome permettant d’annuler la redirection d’une page web. Par exemple NoRedirect ou Tamperdata. Le premier est spécialisé dans l’annulation des redirections. Il faut aller dans les réglages de l’addon et de spécifier le site pour lequel les redirections doivent être supprimées.

 

 

Puis simplement se rendre sur la page et laisser la magie opérer. Cependant j’ai l’impression que le module ne marche que pour les redirections relatives et non absolutes. Il faudrait que je me penche sur la question.

 

 

PHP nous propose également une méthode pour récupérer du content en ligne : file_get_contents(); On peut lui passer un contexte de flux en paramètre de cette façon.

 

On crée la variable $opt qui va contenir les options de contexte PHP particulièrement follow_location à false, puis on crée le contexte contenu dans la variable $ctx. Enfin on récupère la réponse du serveur via file_get_contents qui n’aura pas suivit la redirection grâce au contexte.

Vous connaissez maintenant différentes méthodes pour contourner une redirection mal formée et récupérer la suite de la page. Plus d’excuses pour justifier l’oublie du exit()  sauf si vous voulez avoir quelques surprises assez désagréables.