Ghosts In The Stack

Commentaires - La faille Include

Poster un commentaire - Retour à l'article

Commentaires

sdimitri31, le 28/01/2011 :

Bonjour,
Merci pour ce tuto sur la faille include,
si j'ai bien compris elle y est que sur les include qui passe par l'url ?
Donc si je met mon include dans mon code php il n'y a pas de faille ?
Merci

Réponse :

La faille existe partout où il y a un include prenant en paramètre une variable contrôlable directement par l'utilisateur. C'est donc valable pour les paramètres GET (URL), POST, COOKIE, et quelques entêtes HTTP (X-forwarded-for, User-agent). Si tu fais un include avec une constante, a priori pas de soucis.

Bug, le 15/10/2010 :

Pourquoi alors mettre une variable GET puisque l'instruction se suffit á elle même ? Si on rajoute GET sans corriger la faille on Rajoute du code pour ouvrir une faille, donc pas nécessaire, et ensuite on rajoute encore du code pour la corriger. Alors que juste include empêche cette faille. Non ?

Réponse :

ben c'est pour avoir système de chargement dynamique, si on fait de simples "include" en statique c'est presque comme si on faisait du html. Pour un site dynamique il faut parfois passer par des variables à inclure.

Bug, le 27/09/2010 :

La faille disparaît tout simplement si on met juste :
<?php
include('default.php');
?>

J'ai tester les exploitations sur une page avec un include simple et rien ne se passe.

Réponse :

C'est un peu normal comme aucune variable n'est utilisée.

Valentin, le 10/09/2009 :

Bonjour, en codant mon site j'ai lu votre article et je vous demande si pour combler la faille il ne suffit finalement pas de mettre une ultime condition à l'inclusion.

Voici le code avec la faille :

<?
if(isset($_GET['page']))
include($_GET['page']);
else
include('default.php');
?>

correction de faille :

<?
if(isset($_GET['page'])

&& substr ($_GET['page'], 0, 4)!=='http')
include($_GET['page']);
else include('default.php');
?>

il suffit juste de vérifier si la variable page n'a pas "http" au début.

Ou est-ce insuffisant ?

Cordialement.
Valentin

Réponse :

Héhé... Non, surtout pas ! Ce que tu veux faire, ça reviendrait à mettre allow_url_include à false dans php.ini. C'est une bonne chose, mais ça n'est pas du tout suffisant. En effet ça n'empêche pas d'inclure les fichiers locaux du serveur. Et il y a plein de fichiers intéressants à inclure pour obtenir plein d'informations intéressantes. Par exemple dans /proc, /boot, /etc... Et il y a même moyen d'inclure des fichiers dans lesquels on peut injecter des données directement ! Par exemple les logs d'Apache, que l'on peut injecter simplement en consultant des URLs sur le serveur, où encore pire, les fichiers de sessions PHP. Il y a peu de temps, j'ai justement rooté un serveur par ce biais. Je prévois bientôt un article à ce sujet d'ailleurs...


Donc pour résumer, NON ce n'est pas suffisant. Il faut vraiment avoir une liste de pages autorisées, ou au moins un dossier limite au delà duquel on rejette les inclusions (voir la directive open_basedir).

Symbiote, le 01/06/2007 :

Très bonne article Trancefusion, maintenant je peux securiser l'include.

Merci beaucoup !

Poster un commentaire

Les commentaires sont soummis à certaines règles, qui sont une question de bon sens.

Utilisez-les à bon escient. Vous pouvez donnez votre opinion, vos critiques, nous signaler des fautes, apporter des précisions. Vous pouvez également nous poser des questions ; nous essaierons de vous répondre dans la mesure du possible.

Ne confondez pas commentaires et forum ; votre commentaire doit être en rapport avec l'article. Si vous souhaitez donner un commentaire général sur le site, envoyez-nous plutôt un mail.

Merci de nous laisser votre adresse e-mail, afin que nous puissions vous recontacter si besoin. Le code HTML n'est pas interprété dans les commentaires.

Les commentaires sont soummis à une validation des administrateurs. S'ils ne respectent pas ces règles, ils seront systématiquement refusés. Merci de votre compréhension ;-)