代码之家  ›  专栏  ›  技术社区  ›  xRobot

有人入侵了我的数据库-怎么做到的?

  •  32
  • xRobot  · 技术社区  · 14 年前

    有人入侵了我的数据库,把桌子掉了。

    在我的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 回复  |  直到 8 年前
        1
  •  67
  •   Community CDub    7 年前

    mysql_real_escape_string

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

    如下所述: 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
        2
  •  6
  •   Paul Dixon    14 年前

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

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

        3
  •  3
  •   atmorell    14 年前

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

    下面是一些关于锁定php代码的文章 http://www.addedbytes.com/writing-secure-php/

    谨致问候。 阿斯比恩·莫雷尔

        4
  •  2
  •   cyber-guard    14 年前

    数据库被破坏并不意味着有sql注入。如果需要,可以共享访问日志,这将提供足够的线索作为攻击者进入的位置。我猜是本地文件包含,他包含了配置文件,或者可能是某种代码执行漏洞。如果没有更多的信息,它只是猜测,它可能已经很好的社会工程工作,或钓鱼攻击。。。

        5
  •  1
  •   dartacus    14 年前

    表面上看,您还没有为sql注入攻击留下任何漏洞。这段代码绝对是入侵发生的地方吗?

    我唯一能看到的是一家托管提供商关于ucwords的含糊不清的声明: http://2by2host.com/articles/php-errors-faq/disabled_ucwords/

        6
  •  0
  •   Alireza    12 年前

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