logo du site

Timituto,le site de tutoriaux de A à Z

logo du site

Eviter les failles sur son site web

Info


crée par : supersnail
Le :21/03/2010

Avancement :40%

Bonjour!

Je me suis fait hacker mon site, comment éviter les failles sur mon site?
Je crée un site web, et j'aimerais avoir quelques conseils pour ne pas me faire hacker



Justement, dans ce tutoriel, nous allons voir comment réduire les failles de votre site web :D

Ce tutoriel n'a pas pour but de rendre votre site "infaillible",mais sert juste à limiter les dégâts. Bien sûr, le fait de se faire hacker son site ne dépend pas QUE de votre code,mais d'autres paramètres,comme la version de votre serveur web, qui peut contenir des failles lui aussi :roll:



I- Quelques conseils en vrac
Lorsque vous concevez un site web, vous devez toujours garder ceci à l'esprit:

Un hacker peut toujours avoir accès au code source de la page, et peut même le modifier à sa guise.

Qu'est-ce que cela veut dire?


Et bien, ça veut dire que si vous utilisez des champs de formulaire cachés pour transmettre des données, et bien ceux-ci seront visibles pour le hacker, qui pourra les manipuler comme il veut ;).

Autre exemple: Toutes les vérifications que vous faites via javascript (par exemple vérification d'e-mails) peuvent être contournées très facilement par le hacker (avec des outils comme Firebug par exemple).

Donc, vous devez TOUJOURS vérifier que les données rentrées sont bien ce qu'elles sont supposées être, ou le mieux est de le rendre inaccessible au hacker (par exemple en mettant les champs hidden dans une session à la place, ou en faisant les vérifications de la validité d'e-mail directement en PHP).

II- Injections SQL
Pour illustrer mes propos,je vais vous proposer une étude de cas.
Imaginons un système comme Twitter (c'est-à-dire la possibilité de poster des messages courts) mais faillible.
Nous pourrions avoir par exemple,pour le système de connexion:
Code : php
  1. <?php
  2. include('fonctions.php');
  3. include('connexion.php'); //contient les mots de passe de la BDD
  4. //Ici,les magic quotes sont activées (pour la protection contre les injections SQL).
  5. $req = mysql_query( "SELECT * FROM users WHERE pseudo='".$_POST['pseudo']."'" );
  6. $tab = mysql_fetch_array($req);
  7. if($tab["passe"] == md5($_POST['password'])
  8. {
  9. $_SESSION['idUser'] = $tab['id_user'];
  10. $_SESSION['pseudo'] = $tab['pseudo'];
  11. notifie( "Vous êtes correctement connecté(e)" ); //Affichera une redirection
  12. }
  13. else
  14. {
  15. notifie( "Mauvais login ou password" ); // On est mal connecté
  16. }
  17. ?>

et puis pour le système d'envoi de messages (envoi.php):
Code : php
  1. <?php
  2. //Les magic quotes sont activées,on est protégés des injections SQL
  3. include('fonctions.php');
  4. include('connexion.php'); //contient les mots de passe de la BDD
  5. if(!utilisateurConnecte())
  6. {
  7. notifie( "Vous n'êtes pas connecté." );
  8. }
  9. else
  10. {
  11. makeHeaders('Poster un message'); //On ajoute le header du site
  12. if(!isset($_POST['msg'])
  13. {
  14. //On a pas envoyé de message
  15. ?>
  16. <form action="envoi.php" method="POST">
  17. Message: <textarea name="msg">Votre message</textarea><br/>
  18. <input type="hidden" name="id" value="<?=$_SESSION["id"]?>"/>
  19. <input type="submit" value="Raconter ma vie"/>
  20. </form>
  21. <?php
  22. }
  23. else
  24. {
  25. //On insert le message dans la DB
  26. $id = $_POST["id"];
  27. $msg = $_POST["msg"];
  28. mysql_query( "INSERT INTO messages (id,mesg) VALUES ($id,'$msg')" );
  29. echo "Votre message a correctement été envoyé";
  30. }
  31. makeFooter(); //ajoute le footer du site
  32. }
  33. ?>


Et voici donc notre code :) (ce qui va nous intéresser pour le moment)

Mais elles sont où les failles? Y'en a pas!


Bah justement... si (sinon ce tuto n'existerait pas :p)

Tout d'abord,regardons cette ligne:
Code : php
  1. mysql_query( "INSERT INTO messages (id,mesg) VALUES ($id,'$msg')" );

Nous savons que la variable $id provient d'un champ hidden et que notre $msg provient,lui de notre textarea :D.
Or malheureusement pour nous, les champs "hidden", qui sont invisibles pour le commun des mortels, sont visibles pour les hackers.
Un hacker pourrait donc récupérer l'id user d'un utilisateur, et remplacer son "id" par celui de sa victime.Le code serait ainsi trompé et croirait que c'est la victime qui a envoyé le message (vu que l'id user est celui de la victime).
Certes parler à la place d'un autre peut être très amusant,mais les hackers préfèrent souvent s'attaquer au coeur du site.
Je vous le dis donc (le dites à personne,c'est un secret :p ) , il y a aussi une injection SQL de possible.

Ah bon? Où ça? Pourtant y'a les magic quotes activées!


Bah en fait, les magic quotes, contrairement à ce qu'on pourrait penser, ne sont pas magiques du tout, et ne font que rajouter des devant un ' ou un ".
Et vous n'avez pas remarqué que la variable $id étant numérique,elle était facilement candidate aux injections SQL?
En effet, si nous modifions notre champ hidden et que nous lui injectons ceci:
Code : sql
  1. 1,CHAR(65));TRUNCATE messages; --
, bah notre variable $id contiendra ce code
Notre requête SQL deviendra donc:
Code : sql
  1. insert into messages (id,mesg) values (1,CHAR(65));TRUNCATE messages; --,'trollol')

autrement dit: nous insérons un message bidon , puis nous effaçons tous les messages! (et on pourrait faire bien d'autre chose)

La faille présentée ici n'est pas exploitable telle quelle n'est pas exploitable directement,étant donné que la fonction mysql_query() ne permet l'exécution QUE d'une seule requête à la fois (ainsi, l'utilisation du caractère ";" ne fonctionnera pas). Cependant, cela ne veut pas dire qu'il faut fermer les yeux sur cette faille,car on peut passer par d'autres moyens pour injecter du SQL!


Mais pourquoi avoir mis CHAR(65)?


Bah les magic quotes sont activées par défaut... Donc si j'avais mis "blabla" à la place, la chaîne aurait été transformée en "blabla" , faisant ainsi échouer l'injection :(

Mais comment se protéger?


Justement, nous y arrivons :D. Pour se protéger contre les injections SQL, bah il faut vérifier que ce qu'on reçoit correspond bien à ce qu'on est censé recevoir... (par exemple si on attend une variable numérique, bah il faut vérifier que ce qu'on reçoit soit bien un nombre ;) ).
Bref: Il vaut mieux faire trop de vérifications que pas assez. Et ensuite, le mieux est de cacher les informations sensibles des yeux du hacker , dans des sessions par exemple

Ne stockez JAMAIS rien d'important dans les cookies, car les hackers peuvent très facilement les récupérer via des failles XSS (que nous aborderons dans la prochaine partie). De plus, les cookies, comme le reste, sont modifiables :aie:


III- Les failles XSS

Nous allons présenter un autre type de failles, peu connues aux yeux des développeurs, mais très dangereuses : en effet, grâce à une faille XSS,il est possible d'obtenir des droits administrateur, voire pire, de contrôler le navigateur web de l'utilisateur!

Les failles XSS (dites Cross Site Scripting) permettent de faire exécuter du code javascript arbitraire à une page web.
Prenons par exemple ce code:
[code=php][/code]


Pour résumer le tutoriel:
Pour vérifier la sécurité de son site, le mieux est encore de rentrer dans la peau du hacker, et d'essayer de trouver comment un hacker pourrait s'attaquer au site avec le code qu'on a écrit (personnellement j'ai adopté cette méthode qui fonctionne plûtot bien :p)

bas de la page

compatible Mozilla firefoxPour le bon fonctionnement du site, il est conseillé d'utiliser Mozilla Firefox.incompatible internet explorer

© 2009 Valid XHTML 1.1 CSS Valide !

Haut de la Page