web-dev-qa-db-fra.com

Comment contourner MySQL_Real_Escape_string pour exploiter une vulnérabilité SQLI?

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?

5
user126623

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à.

2
Bryan Field