par xavier » 06 Juin 2003 12:01
effectivement remi ! mais depuis, on a corrigé ! et si tu savais tout ce qui a déjà été customisé et modifié , pfffff ! quel boulot !
<BR>
<BR>pour ceux que ça intéresse : (source phpsecure.info)
<BR>
<BR>Le problème se trouve dans le fichier index.php, dans la fonction rate_article,
<BR>dont voici le code :
<BR>----------------------------------------------------------------------------------------------------------------------------
<BR>[...]
<BR>function rate_article($sid, $score) {
<BR> global $prefix, $dbi, $ratecookie, $sitename, $r_options;
<BR> if ($score) {
<BR> if ($score > 5) { $score = 5; }
<BR> if ($score < 1) { $score = 1; }
<BR> if (isset($ratecookie)) {
<BR> $rcookie = base64_decode($ratecookie);
<BR> $r_cookie = explode(":", $rcookie);
<BR> }
<BR> for ($i=0; $i < sizeof($r_cookie); $i++) {
<BR> if ($r_cookie[$i] == $sid) {
<BR> $a = 1;
<BR> }
<BR> }
<BR> if ($a == 1) {
<BR> Header("Location: modules.php?name=News&op=rate_complete&sid=$sid&rated=1");
<BR> } else {
<BR> $result = sql_query("update ".$prefix."_stories set score=score+$score, ratings=ratings+1 where sid='$sid'", $dbi);
<BR> $info = base64_encode("$rcookie$sid:");
<BR> setcookie("ratecookie","$info",time()+3600);
<BR> Header("Location: modules.php?name=News&op=rate_complete&sid=$sid$r_options");
<BR> }
<BR> } else {
<BR> include("header.php");
<BR> title("$sitename: "._ARTICLERATING."");
<BR> OpenTable();
<BR> echo "<center>"._DIDNTRATE."<br><br>"
<BR> .""._GOBACK."</center>";
<BR> CloseTable();
<BR> include("footer.php");
<BR> }
<BR>}
<BR>
<BR>[...]
<BR>
<BR>switch ($op) {
<BR>
<BR>[...]
<BR> case "rate_article":
<BR> rate_article($sid, $score);
<BR> break;
<BR>[...]
<BR>
<BR>}
<BR>
<BR>?>
<BR>----------------------------------------------------------------------------------------------------------------------------
<BR>Cette fonction permet de voter pour des articles sur le site.
<BR>la ligne importante est celle-ci :
<BR>-------------------------------------------------------------------------------------------------------------------
<BR>$result = sql_query("update ".$prefix."_stories set score=score+$score, ratings=ratings+1 where sid='$sid'", $dbi);
<BR>-------------------------------------------------------------------------------------------------------------------
<BR>On peut donner entre 1 et 5 point à l'article, comme le montre ces lignes :
<BR>---------------------------------------
<BR> if ($score > 5) { $score = 5; }
<BR> if ($score < 1) { $score = 1; }
<BR>---------------------------------------
<BR>Quand la ligne de code contenant la requête SQL est donc executée, le score est ajouté dans la base de donnée
<BR>("score=score+$score"), et le nombre de personnes ayant voté augmente de 1 ("ratings=ratings+1").
<BR>$prefix ayant comme valeur de défaut 'nuke', on voit que ces informations sont enregistrées dans la table nuke_stories.
<BR>Hors cette table est la table où toutes les informations des news sont enregistrées (titre, intro, article, auteur,...).
<BR>$score est modifiable par l'utilisateur. C'est donc la variable qui va nous servir à l'injection SQL.
<BR>Un bête exemple, si on veut donner 2 points à l'article dont l'id est 15, mais ne pas enregistrer un vote supplementaire
<BR>dans la base de données, seulement des points supplémentaires, on pourrait donner comme valeur à $score : 2 where sid='15'/*
<BR>La requête SQL serait alors :
<BR>----------------------------------------------------------------------------------------
<BR>update nuke_stories set score=score+2 where sid='15'/*, ratings=ratings+1 where sid='15'
<BR>----------------------------------------------------------------------------------------
<BR>Ce qui se trouve après les caractères de commentaire (/*), c'est-à-dire : , ratings=ratings+1 where sid=''
<BR>ne sera pas pris en compte lors de l'execution, et la requête executée dans la base sera :
<BR>----------------------------------------------------
<BR>update nuke_stories set score=score+2 where sid='15'
<BR>----------------------------------------------------
<BR>Pour le même résultat, on aurait pu donner à $score la valeur par exemple :
<BR>2, ratings=ratings-1
<BR>Ce qui aurait revenu à faire ratings=ratings-1+1, ce qui ne change evidemment rien de la valeur de ratings.
<BR>Les possibilités sont nombreuses...
<BR>
<BR>Mais comme on est dans la même table que les autres informations des news, on peut changer autre chose que le score ou le nombre
<BR>de 'votants' ! On peut changer titre, intro, texte principal,... !!! Il y a par exemple les champs topic, title, hometext,
<BR>bodytext, comments, ...
<BR>
<BR>voila voila......
<BR>
<BR>une faille de plus qui d'ailleurs commence à dater <IMG SRC="images/smiles/icon_boxe2.gif">
<BR>
<BR>Il est évident que si personne n'avait mis en ligne un soft permettant d'automatiser l'exploitation de cette faille, il y aurrait peut etre eu un peu moins de script kiddies <IMG SRC="images/smiles/icon_cussing.gif">
<BR>
<BR>
<BR>