有人攻击我的数据库并放弃了该表。
在我的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
已停用。
那么,我的数据库是怎么被黑了的?
答案 0 :(得分:67)
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扫描。