Page 1 sur 1

Blind sql injection

Posté : 14 nov. 2016, 08:20
par mumbly
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 !

Re: Blind sql injection

Posté : 14 nov. 2016, 10:29
par tof73
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.

Re: Blind sql injection

Posté : 14 nov. 2016, 11:08
par @rthur
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

Re: Blind sql injection

Posté : 14 nov. 2016, 14:02
par mumbly
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.

Re: Blind sql injection

Posté : 15 nov. 2016, 23:18
par @rthur
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");
}

Re: Blind sql injection

Posté : 17 nov. 2016, 19:59
par mumbly
Merci mille fois : j'ai réussi je pense ...

Re: [RESOLU] Blind sql injection

Posté : 18 nov. 2016, 01:32
par @rthur
top ! :)