有人攻击了我的数据库 - 怎么样?

时间:2010-11-22 08:40:19

标签: php mysql sql-injection

有人攻击我的数据库并放弃了该表。

在我的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 已停用

那么,我的数据库是怎么被黑了的?

6 个答案:

答案 0 :(得分:67)

mysql_real_escape_string

  

MySQL连接。如果未指定链接标识符,则假定mysql_connect()打开的最后一个链接。如果没有找到这样的链接,它将尝试创建一个,就好像没有参数调用mysql_connect()一样。如果未找到或建立连接,则会生成E_WARNING级别错误。

在此解释:Does mysql_real_escape_string() FULLY protect against SQL injection?

根据您的代码段,您已连接数据库两次。

$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

答案 1 :(得分:6)

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

然后,只是仔细审核每个候选请求中的代码,直到你指出它为止:(

答案 2 :(得分:3)

也许你有一个密码较弱的MySQL用户。我会更改所有密码并检查谁有权连接到MySQL数据库。锁定防火墙,以便只打开所需的端口(80,443?)

这里有一些关于锁定你的PHP代码的文章 http://www.addedbytes.com/writing-secure-php/

祝你好运。 AsbjørnMorell

答案 3 :(得分:2)

您的数据库遭到入侵的事实并不意味着有一个SQL注入。如果你愿意,你可以共享访问日志,这应该提供足够的线索,因为攻击者进入了。我的猜测是本地文件包含,其中包括配置文件,或者可能是某种代码执行漏洞。没有更多的信息,它只是猜测,它可能是一个很好的社会工程工作,或网络钓鱼攻击......

答案 4 :(得分:1)

从表面上看,你没有为sql注入攻击留下任何空缺。这段代码绝对是引入入侵的代码吗?

我唯一可以看到的是来自托管服务提供商的关于ucwords的暧昧声明:http://2by2host.com/articles/php-errors-faq/disabled_ucwords/

答案 5 :(得分:0)

我认为这是通过php shell(后门)完成的。 那是共享主机吗?如果是这样,检查同一服务器上的其他网站是否也受到攻击,这将帮助您查看攻击者是否从您的邻居进入您的网站。要查看服务器上的网站,您需要反向ip扫描。