有人入侵了我的数据库 - 如何?

2022-08-30 14:09:56

有人破解了我的数据库并删除了该表。

在我的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

那么,我的数据库是如何被黑客入侵的呢?


答案 1

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_conmysql_real_escape_string

答案 2

看起来您粘贴的代码不会提供合适的攻击。我调查这个问题的方法是扫描MySQL二进制日志以查找相关的DROP TABLE语句,给我一个时间戳。然后,您可以使用该时间戳来查找可以与之关联的Apache请求。

然后,这只是仔细审核每个候选请求中的代码,直到您将其钉:(


推荐