[RESOLU] Blind sql injection

Eléphanteau du PHP | 14 Messages

14 nov. 2016, 08:20

En passant par les services de https://wssa.beyondsecurity.com pour "tester" mon site, j'ai découvert plusieurs vulnérabilités.
Notamment, une "blind sql injection" :

Code : Tout sélectionner

[b]Blind SQL Injection[/b] URL: http://www.freetorrent.fr/membres.php?tri=memberID&ordre=DESC&p=2 Affected Parameter: tri Vector Used: VALUE AND SLEEP(24)=0 Pattern found: Timing test
... et là j'ai besoin de vos lumières car, même si cela peut vous parraitre enfantin..., là, je ne sais pas comment protéger cette ligne.
Un coup de main ?
Mille mercis !

Mammouth du PHP | 672 Messages

14 nov. 2016, 10:29

tu vérifies que la valeur passée est bien dans la liste des valeurs que tu attends avec http://php.net/manual/fr/function.in-array.php par exemple.

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7376 Messages

14 nov. 2016, 11:08

Tu peux utiliser également la fonction filter_input(), très très pratique pour filtrer les variables en entrée de tes scripts.
http://php.net/manual/fr/function.filter-input.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 14 Messages

14 nov. 2016, 14:02

Merci...
mais désolé, je suis paumé :/
Dans la ligne suivante, c'est le "paramètre" tri qu'il faut que je protège ?

Code : Tout sélectionner

<th style="width: 250px;"><a style="color: #fff; text-decoration: none;" href="membres.php?tri=username&ordre=desc">&#x2191;</a>Pseudo<a style="color: #fff; text-decoration: none;" href="membres.php?tri=username&ordre=asc">&#x2193;</a></th>
Si je prends filter_input, faut-il que je fasse comme cela ? :
$tri_html = filter_input(INPUT_GET, 'tri', FILTER_SANITIZE_SPECIAL_CHARS);
$tri_url = filter_input(INPUT_GET, 'tri', FILTER_SANITIZE_ENCODED);

Mille mercis.

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7376 Messages

15 nov. 2016, 23:18

Toutes les variables que tu reçoit d'un utilisateur doivent être filtrées, sans exception.
Dans ton exemple, il faut donc filtrer les variables tri, ordre et p

Pour ta variable tri spécifiquement, quelle valeur peut-elle avoir ?
Si c'est uniquement quelques nom de champs alors le mieux c'est effectivement de filtrer avec un in_array() comme proposé par tof73, idem pour ordre
Pour p si il s'agit que d'un entier pour le n° de page, alors tu peux utiliser le filtre FILTER_VALIDATE_INT


Voici un exemple pour in_array() :
<?php
if ( !empty($_GET['ordre']) && !in_array($_GET['ordre'], array('asc','desc') ) { 
     die("Paramètre ordre incorrect");
}
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 14 Messages

17 nov. 2016, 19:59

Merci mille fois : j'ai réussi je pense ...

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7376 Messages

18 nov. 2016, 01:32

top ! :)
Quand tout le reste a échoué, lisez le mode d'emploi...