Null Byte Injection (Fin prématurée de chaîne de caractères)
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 chaîne 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 chaîne de caractères
. Quand ce caractères est encodée en URL il devient
%00. Sa présence dans la chaîne met fin aussitôt à celle-ci à l'endroit de sa déclaration. Par exemple Si une chaîne de caractères reçue via l'URL a la valeur
Bonj%00our, alors la chaîne effective qui sera traitée au moment de l'exécution est
Bonj. La présence de %00 met fin à la chaîne 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 chaîne de caractères 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 chaîne 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 chaîne est déclarée juste après, alors l'extension
.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 (c'est à dire le fait d'inclure toutes les pages du site Web dans la page d'accueil à la demande de l'utilisateur) pose beaucoup de problèmes, 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.