Sécurité des applications Web - Menaces et contre-mesures

Auteur: Mohamed CHINY Durée necessaire pour le cours de Sécurité des applications Web - Menaces et contre-mesures Niveau recommandé pour le cours de Sécurité des applications Web - Menaces et contre-mesures Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 7: Null Byte Injection

Toutes les pages

Null Byte Injection (Fin de chaine prématurée)

Définition

Null Byte Injection est une attaque sérieuse qui consiste à polluer l'entrée d'un site Web (souvent via URL) par une fin de chaine de caractères mal placée, pour détourner le fonctionnement de celui-ci.

Comme pour l'attaque injection du code arbitraire, la vulnérabilité au Null Byte Injection survient quand les entrées ne sont pas filtrées. Le pirate abuse alors de cette confiance et aspire à avoir des informations confidentielles dont il n'a pas l'autorisation d'approcher.

L'attaque est forgée sur la base du caractère spécial qui représente une fin de chaine de caractères . Quand ce caractères est encodée en URL il devient %00. Sa présence dans la chaine met fin aussitôt à celle-ci à l'endroit de sa déclaration. Par exemple Si une chaine de caractères reçue via l'URL a la valeur Bonj%00our, alors la chaine effective qui sera traitée au moment de l'exécution est Bonj. La présence de %00 met fin à la chaine de caractère d'une façon prématurée.

Quand le pirate réussit cette attaque alors il peut avoir accès à des informations confidentielles, comme les fichiers de mots de passe, les codes sources, et parfois même des fichiers système présents en dehors du dossier d'hébergement.

Exploitation

Certains développeurs préfèrent afficher toutes les pages de leurs sites Web à travers la page d'accueil (index.php). Quand le client clique sur un lien pour charger une autre page, seulement le contenu de la page est chargée puis inséré dans la page d'accueil. Le contenu change donc mais la page reste la même.

Exemple:
<?php
   $page=$_GET["page"];
   echo file_get_contents($page.".php");
?>
Si par exemple on passe la chaine suivante à travers l'URL
http://www.site-victime.com/index.php?page=contact
alors c'est le contenu de la page contact.php qui sera affiché sur la page d'accueil.

Si la vulnérabilité existe sur le site, le pirate peut par exemple passer la chaine suivante:
http://www.site-victime.com/index.php?page=.htaccess%00
Dans ce cas, la page demandée est .htaccess, et puisque la fin de chaine est déclarée juste après, alors l'extention .php ne sera pas prise en considération. Donc, on risque de se retrouver avec le contenu du fichier .htaccess affiché sur le navigateur.

En gros, ce n'est pas la fin du monde si on se retrouve avec le contenu de ce fichier dévoilé à un intrus, mais imaginez que le fichier était tout autre, comme /etc/passwd ou la définition des vhosts ou autre fichier confidentiel...

Comment s'en protéger?

Au niveau du code PHP

Il est évident qu'une telle pratique pose beaucoup de problème, alors autant en minimiser l'usage. Mais si vous voulez quand même travailler ainsi alors il faut veiller à bien filtrer les entrées et exclure les caractères spéciaux comme %. Il faut aussi définir la liste des noms de toutes les pages susceptibles d'être appelées pour ne pas donner l'occasion au pirate de définir les noms qui lui passent par la tête.
LFI (pour Local File Injection) est un autre nom que l'on donne à l'attaque Null Byte Injection. Des fois les deux attaques peuvent être légèrement différentes mais complémentaires pour avoir plus de chance d'aboutir.