Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有人入侵了我的数据库-怎么做到的?_Php_Mysql_Sql Injection - Fatal编程技术网

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

Php 有人入侵了我的数据库-怎么做到的?,php,mysql,sql-injection,Php,Mysql,Sql Injection,有人侵入了我的数据库,把桌子掉了 在我的PHP页面中,有一个查询使用mysql\u real\u escape\u字符串: $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);

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

在我的PHP页面中,有一个查询使用mysql\u real\u escape\u字符串:

$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);
并且
寄存器\u globals
禁用


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

从表面上看,你还没有留下任何sql注入攻击的机会。这段代码摘录肯定是入侵发生的地方吗

我唯一能看到的是主机提供商关于ucwords的含糊不清的声明:


G

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

下面是一些关于锁定php代码的文章

致以最良好的祝愿。
Asbjørn Morell

您的数据库被破坏的事实并不意味着存在sql注入。如果愿意,您可以共享访问日志,该日志应提供足够的线索,说明攻击者从何处进入。我猜可能是本地文件包含,其中他包含了配置文件,或者可能是某种代码执行漏洞。如果没有更多的信息,这只是猜测,它可能是良好的社会工程工作,或网络钓鱼攻击…

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

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

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

如下文所述:

根据您的代码片段,您已经连接了数据库两次

$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对为多字节字符提供的
$\u POST
的真正转义没有影响

暗示

  • 删除第二个
    mysql\u连接($db\u主机,$username,$password);
  • 执行
    mysql\u real\u escape\u string时显式添加
    $db\u con

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

您的连接使用什么字符集?查看PDO及其准备的语句。它将d为您节省大量时间和麻烦。为什么您要使用两次
mysql\u select\u db()
?为什么在当今这个时代,有人在为SQL使用“大脑死亡”动态生成的字符串?(实际有效的用例非常遥远,介于两者之间。)现在一天,对MySQL的远程访问在默认情况下是禁用的,通常也会被列为白名单,除非您的主机糟糕。
对MySQL的远程访问在默认情况下是禁用的
-可以证明这一点吗?或者提供更多信息吗?当您安装MySQL服务器时,远程访问,即从另一台计算机登录,而不是从e MySQL守护程序正在运行,将被禁用;这意味着您必须明确允许它。因此,即使此人拥有MySQL用户名/密码,他们也无法利用它并登录,除非他们能够在远程计算机上执行代码;在这种情况下,整个服务器的安全性将完全受到威胁…重复使用密码rds for MySQL、FTP和SSH完全不同,虽然问题迫在眉睫,但它与MySQL本身的安全性无关。至少对于linux box来说不是这样,而是由权限控制的。我在哪里可以看到访问日志?我有Cpanel和共享主机:)这在很大程度上取决于您的主机和cpanel版本。将它们放在根目录的“logs”目录中是很常见的;通常也可以通过cpanel访问,查找“服务器信息/日志”等。。。如果你找不到它们,我建议询问你的主机提供商。那么我担心入侵者很可能删除了日志,所以现在有办法找到。。。您可能仍然希望联系您的主机提供商并请求日志,通常情况下,他们会保留客户端无法访问的副本。考虑到攻击者可能具有写访问权限,我会检查网站是否有任何可能留下的后门、php外壳等+1对于您的井解释和链接,2013年10月:mysql\u real\u escape\u字符串已被弃用。使用mysqli_real_escape_string()或PDO::quote()作为可能的读者的注释。这个“答案”并不能解释数据库是如何被黑客入侵的。因为对于OP中提供的代码,不可能注入任何内容。链接帖子中提到的编码都没有使用,因此使用了默认的拉丁语1,这意味着该代码是不受攻击的。