SOMMAIRE : [ 1 ] Introduction [ 2 ] Les failles de PHP [ 2.1 ] Vulnérabilité 'e

SOMMAIRE : [ 1 ] Introduction [ 2 ] Les failles de PHP [ 2.1 ] Vulnérabilité 'escape shell' [ 2.2 ] Fonction include() [ 2.3 ] Fonction mail() [ 2.4 ] Les fichiers de logs de Apache [ 2.5 ] Script d'upload [ 3 ] PHP & MySQL [ 3.1 ] Requetes MySQL multiples [ 3.2 ] Fakes posts [ 3.3 ] Stupid DoS [ 3.4 ] Bypasser une authentification [ 4 ] Conclusion & remerciements -------------------------------------------------------------------------------- [ 1 ] Introduction : Le PHP est un language de script très performant, et de plus en plus utilisé dans le dévelloppement de site web. Ce language est doté d'une multitude de fonctions allant du simple affichage de données à la gestion des sockets, en passant par la gestion d'un serveur mail ou encore l'utilisation de commandes système. Ainsi de part la multitude de ses fonctions, le PHP offre aussi la possibilité d'obtenir des informations, voire même un acces (partiel ou complet) au systeme. Il est donc nécessaire à tout développeur de scripts, voire même aux administrateur systeme de comprendre ce language et de repérer les éventuelles problèmes que des scirpts pourraient causer. Cet article à donc pour but de vous expliquer les principes de la sécurité PHP en analysant différentes fonctions/scripts pouvant s'avérer vulnérables. Nous etudierons tout d'abord les scripts et/ou les fonctions PHP pouvant être vulénrables, puis nous étudierons les failles liées à MySQL, système de base de donnée le plus utilisé en interfaçage avec PHP. Il faut savoir que le language PHP est en constante évolution, ainsi cet article n'est en aucun cas une liste exhaustive des failles pouvant exister, ni même une liste des solutions possibles, cependant il essaiera d'aborder et d'expliquer toutes les situations envisageables. Vous pouvez envoyer vos commentaires par email à medgi@ht.st [ 2 ] Les failles de PHP : [ 2.1 ] Vulnerabilite escape shell : Le language PHP possède une fonction 'system()' permettant d'utiliser directement des commandes systemes. Ainsi il est évident que cette fonction peut s'avérer dangereuse puisque si l'attaquant réussi à détourner un script utilisant cette fonction, il gagne un acces partiel, voire même complet (euh ca existe encore des httpd avec les droits root :p). Voyons tout d'abord un schéma classique. Le webmaster désire afficher l'uptime de son server, dans le cadre d'une page de statistique. Il pourra alors porcéder ainsi : <? echo system("uptime"); ? > Ce qui affichera au client http une ligne dans ce genre : 4:00am up 1 day, 5:02, 3 users, load average: 0.00, 0.03, 0.00 Cependant imaginez que le webmaster en question désire passer ses commandes dans des variables, en pensant que cela lui facilitera la lecture de son script, ou pour n'importe quelle autre raison. Il procédera alors ainsi : <? system($cmd); ? > Si nous le consultons de cette maniere : http://subkulture/system.php?cmd=uptime, le serveur nous affichera le même type de résultat que précédemment. Cependant il suffit que nous modifions la variable $cmd par une autre commande pour voir apparaitre tout autre chose : http://subkulture/system.php?cmd=cat%20/etc/issue [ Resultat : ] Red Hat Linux release 7.1 (Seawolf) Kernel 2.4.2-2 on an i686 Ainsi comme vous pouvez le constater, si nous détournons la variable $cmd, nous pouvons nous servir de la page script PHP comme un remote shell ayant les droits du daemon httpd. Il est évident que cette faille est flagrante et que n'importe quel webmaster faisant appel à la fonction system() n'utilisera pas la deuxième méthode. Cependant il existe une seconde possibilité de détourner cette fonction. Imaginons qu'un site web veuille fournir à ses usagers un services comme traceroute par exemple. Il pourra utiliser une page munie d'un formulaire HTML pour récupérer une IP, puis concaténer cette IP avec une autre chaine de caractere, pour enfin executer la commande voulue. Petit exemple : <? $cmd = "traceroute ".$cmd; system($cmd); ? > Ainsi, en entrant comme valeur 'www.yahoo.com' nous obtiendrons un résultat de ce style : traceroute: Warning: www.yahoo.com has multiple addresses; using 64.58.76.179 traceroute to www.yahoo.akadns.net (64.58.76.179), 30 hops max, 38 byte packets ... 9 gblon523-tc-p8-0.ebone.net (213.174.71.65) 52.138 ms 47.755 ms 47.945 ms 10 usnyk405-tc-p3-0.ebone.net (213.174.70.58) 115.571 ms 116.682 ms 119.300 ms 11 usnyk105-tc-r2-0.ebone.net (213.174.69.162) 119.398 ms 115.842 ms 119.985 ms 12 ebone-px-jrcy01.exodus.net (195.158.229.130) 120.114 ms 116.874 ms 119.346 ms ... Imaginez maintenant que nous entrions comme requete 'www.yahoo.com | nmap localhost'. Le script PHP effectuera d'abord la premiere commande, à savoir 'traceroute www.yahoo.com', puis il ne concatenera pas la deuxieme commande avec 'traceroute ', et de ce fait elle sera executée. On aura alors un résultat de ce type : Starting nmap V. 2.54BETA29 ( www.insecure.org/nmap/ ) Interesting ports on subkulture (127.0.0.1): (The 1545 ports scanned but not shown below are in state: closed) ... Il est donc, comme nous l'avons vu, possible de corrompre le systeme ou encore utiliser des programmes; cependant il est beaucoup plus pratique pour une question de lecture des données, d'utiliser cette méthode dans le but d'obtenir un maximum d'information sur le serveur (version du kernel, port ouvert, distribution ...). Voyons maintenant comment résoudre cette faille. Dans le premier cas, il est possible de créer un script de parsing des commandes envoyées, cependant cette méthode n'est pas envisageable, vu la quantitée de commandes *nix existante. Cependant une méthode relativement simple consiste à ne pas placer les commandes dans des variables, ou alors faire une définition de la variable ($cmd= "uptime"). Dans le second cas, la solution la plus simple consiste à repérer le caractere pipe '|' et arreter le script. Attention, ne pas oublier d'effectuer une recherche sur l'equivalent du pipe en URL- Encode (à savoir %7c). N'oublions pas que cette méthode fonctionne aussi avec les caracteres & (and) ou encore ; (point virgule). Il faut donc aussi parser notre requete pour ces memes caracteres. Exemple pour le caractere 'pipe' : if( (strstr($cmd, "|")) || (strstr($cmd, "%7c") ) { echo "Erreur : caractere interdit !"; break(); } [ 2.2 ] Fonction include() : La fonction include() permet, comme son nom l'indique, d'inclure le contenu d'un fichier dans un script php. Cette fonction est dans la plupart utiliser pour créer des pages dynamiques à proprement parler, comme par exemple en incluant un fichier de configuration. Ainsi, une page pourrait s'organiser de la façon suivante : <? include("config.php"); include("header.php"); if(file_exists($page)) include($page); else include("erreur404.php"); include("footer.php"); ? > Appel de la page : http://subkulture/index.php?page=news.php Ce code est assez simple à comprendre : le script PHP inclut un fichier de configuration et le header de la page (contenant diverses informations comme le titre, les feuilles de style ....), puis il vérifie si le fichier contenu dans la variable $page existe, et l'inclut (ou inclut une page d'erreur 404 si il n'existe pas). Enfin le script inclut le footer (contenant les fermetures de balise par exemple). Ainsi il est assez simple de détourner le script en modifiant le contenu de la variable par un fichier 'sensible' : http://subkulture/index.php?page=../../../../../etc/inetd.conf (la plupart des serveur utilsant encore inetd et pas xinetd Comme vous pouvez le constater cette failles permet une fois encore d'obtenir des informations sur le serveur. Il est donc évident que plus un attaquant à d'information sur votre système, plus celui ci aura de chance de s'introduire dans ce systeme. Pour sécuriser une faille de ce genre, la possibilité la plus simple reste une fois encore d'intervenir directement au niveau du script, par exemple ajoutant une extension au fichier à consulter : <? include("config.php"); include("header.php"); $page = $page.".php"; // Ajout d'une extension .php if(file_exists($page)) include($page); else include("erreur404.php"); include("footer.php"); ?> ou encore de parser certains caracteres comme les slash, pour éviter le changement de répertoire : $page = ereg_replace("/","subk"); // Modification de '/' par 'subk' $page = ereg_replace("%2f","subk); // Idem mais avec l'equivalent unicode de / (%2f) Une autre solution serait d'intervenir directement au niveau du système, en changeant les authorisation des utilisateurs (chown), pour éviter que l'user 'httpd' ne puisse accéder aux fichier en dehors de sa racine (htdocs). Pour plus d'information man chown :). [ 2.3 ] Fonction mail() : La fonction mail() permet d'envoyer des emails par l'intermédiaire d'un script PHP. Il n'existe pas vraiment de 'failles' utilisables avec cette fonction, cependant il est possible de l'utiliser dans le but de spamer/mailbomber des emails. Il est évident que vous n'utiliserez pas cette fonction à cet usage, cependant si vous hébergez des sites web, il est possible que vos utilisateurs soient tenté de détournerl'utilisation normale de cette fonction en pensant que c'est votre IP qui apparaitra dans les headers des mails. En effet, un mailbomber est un script très facile à mettre en place. Exemple : <? $to = "victim@troll.com"; $subject = "graou"; $message = "I'm a stupid kiddiez"; for($i=0; $i<5000; $i++) { mail($to, $subject, $message); } ?> Pour eviter que l'un de vos utilisateur n'effectue des spam/mailbomb, le plus simple et le plus efficace est de désactiver cette fonction. Cependant à la manière de certains hébergeurs, vous pouvez aussi recoder une fonction mail personnalisée, que vous nommerez par exemple email(). [ 2.4 ] Les fichiers de logs de Apache : Comme nous uploads/S4/ failles-php.pdf

  • 43
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Jui 30, 2021
  • Catégorie Law / Droit
  • Langue French
  • Taille du fichier 0.0962MB