Кто-то взломал мою базу данных - как?

кто-то взломал мою базу и упала на стол.

на моей странице PHP есть один запрос, где я использую mysql_real_escape_string:

$db_host="sql2.netsons.com";
$db_name="xxx";
$username="xxx";
$password="xxx";    

$db_con=mysql_connect($db_host,$username,$password);    

$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);    
mysql_set_charset('utf8',$db_con); 

$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']);    

if($_POST['M']!=""){  $sim = 1;  }else {  $sim = 0;   }

$query = "INSERT INTO `users` (`email`, `name`, `sex`, `M`) VALUES
( '".$email."', '".ucwords(strtolower($name))."', '".$sex."','".$sim."')";    

$res = mysql_query($query) or die("Query fail: " . mysql_error() );

mysql_close($db_con);

и register_globals is отключен.

Итак, как была взломана моя база данных?

6 ответов


использования mysql_real_escape_string

соединение MySQL. Если идентификатор ссылки не указан, предполагается последняя ссылка, открытая mysql_connect (). Если такая ссылка не найдена, она попытается создать ее, как если бы mysql_connect() был вызван без аргументов. Если соединение не найдено или не установлено, генерируется Ошибка уровня E_WARNING.

как объяснить здесь:полностью ли mysql_real_escape_string() защищает от SQL инъекция?

на основе фрагмента кода Вы дважды подключили базу данных.

$db_con=mysql_connect($db_host,$username,$password);    

$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);    
mysql_set_charset('utf8',$db_con); 

и вы не предоставили идентификатор ссылки базы данных для:

$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']); 

таким образом, mysql_set_charset не влияет на реальный побег поставляется$_POST для многобайтных символов.

предложение

  • удалить второй mysql_connect($db_host,$username,$password);
  • явно добавить $db_con при выполнении mysql_real_escape_string

не похоже, что код, который вы вставили, обеспечивает подходящую атаку. Способ, которым я бы исследовал это, - сканировать двоичные журналы MySQL для соответствующего оператора DROP TABLE, чтобы дать мне метку времени. Затем вы можете использовать эту метку времени для поиска запросов Apache, которые вы можете коррелировать с ней.

тогда это просто случай тщательного аудита кода в каждом запросе кандидата, пока вы не прибьете его : (


возможно, у вас есть пользователь MySQL со слабым паролем. Я бы изменил все пароли и проверил, кто уполномочен подключаться к базе данных MySQL. Заблокируйте брандмауэр, чтобы были открыты только необходимые порты (80,443?)

вот некоторые статьи о блокировке вашего PHP-кода http://www.addedbytes.com/writing-secure-php/

с наилучшими пожеланиями. Asbjørn Morell


тот факт, что ваша база данных была скомпрометирована, не означает, что была инъекция sql. Если вы хотите, вы можете поделиться журналом доступа, который должен предоставить достаточно подсказок, где злоумышленник вошел. Я предполагаю, что это будет локальное включение файла, где он включил файл конфигурации, или, возможно, какая-то уязвимость выполнения кода. Без дополнительной информации это просто догадка, хотя, возможно, это была хорошая работа социальной инженерии или фишинговая атака...


на первый взгляд, вы не оставили отверстия для SQL-инъекции. Является ли этот фрагмент кода определенно тем, где происходит вторжение?

единственное, что я могу найти, это это неоднозначное объявление от хостинг-провайдера об ucwords:http://2by2host.com/articles/php-errors-faq/disabled_ucwords/

G


Я думаю, что это делается через PHP shell (backdoor). Это общий хост? если это так, проверьте, атакованы ли другие веб-сайты на том же сервере или нет, это поможет вам увидеть, попадает ли злоумышленник на ваш сайт из вашего района. Чтобы увидеть веб-сайты на вашем сервере, вам нужно обратное сканирование ip.