J'ai essayé de trouver des exploits d'injection SQL susceptibles de contourner les fonctions qui devraient prévenir les vulnérabilités d'injection SQL, par exemple mysql_real_escape_string
. J'ai trouvé un Exploit et l'auteur décrit la vulnérabilité et posté le code vulnérable:
<?php
if(isset($_GET['pagename'])){
$name=$_GET['pagename'];
$query=sprintf("SELECT* FROM ".PREFIX."page WHERE
pagename = '%s' AND publish = 'Y'",$xx_con->real_escape_string($name));
}
Mais il n'a pas décrit comment contourner la protection, c'est-à-dire la fonction real_escape_string
. Existe-t-il une véritable vulnérabilité SQLI dans le code et comment une attaquante pourrait-elle l'exploiter?
Mise à jour: Voir les commentaires ci-dessous concernant la mise en œuvre correcte.
Réponse originale , avant de savoir que cela était officiellement documenté :
L'utilisation de la fonction
real_escape_string
avec substitution%s
Dans une chaîne déjà citée'%s'
a l'air très suspect.Il pourrait bien y avoir une vulnérabilité si
- si
real_escape_string
Non conçu correctement,- ou non utilisé conformément à sa documentation. (mal utilisé, peut-être avec des citations supplémentaires
'
ou autre chose)
Je recommande vivement d'utiliser une méthode plus standard de résolution de SQLI dans PHP. Celui qui implique ?
La substitution est la meilleure. Cependant, il peut y avoir une autre méthode de codage sonore disponible. Ces méthodes ajoutent généralement leurs propres citations en interne, auquel cas Ajout de citations '
Dans votre code serait inutile.
J'ai remarqué une autre chose à propos de ce code. D'où vient PREFIX
viennent? Si cela est fourni par l'utilisateur, vous avez évidemment une vulnérabilité SQLI. D'autre part, s'il s'agit simplement d'une valeur dure et codée ou bien désinfectée, alors vous êtes d'accord avec celui-là.