提问人:xRobot 提问时间:11/22/2010 最后编辑:CerbrusxRobot 更新时间:11/9/2023 访问量:12051
有人入侵了我的数据库 - 如何?
Someone has hacked my database - how?
问:
有人入侵了我的数据库并删除了该表。
在我的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
那么,我的数据库是如何被黑客入侵的呢?
答:
从表面上看,您没有为 sql 注入攻击留下任何机会。此代码摘录是否绝对是发生入侵的代码摘录?
我唯一能看到的是托管服务提供商关于ucwords的模棱两可的公告:http://2by2host.com/articles/php-errors-faq/disabled_ucwords/
G
也许您有一个密码较弱的MySQL用户。我会更改所有密码并检查谁有权连接到MySQL数据库。锁定防火墙,以便仅打开所需的端口(80,443?
以下是一些关于锁定 php 代码的文章 http://www.addedbytes.com/writing-secure-php/
此致敬意。 阿斯比约恩·莫雷尔
评论
remote access to MySQL is disabled by default
- 能证明这一点吗?或提供更多信息?
您的数据库遭到入侵并不意味着存在 sql 注入。如果需要,可以共享访问日志,该日志应提供足够的线索,说明攻击者的进入位置。我的猜测是本地文件包含,他包含配置文件,或者可能是某种代码执行漏洞。如果没有更多信息,它只是猜测,它也可能是很好的社会工程工作,或者网络钓鱼攻击......
评论
看起来您粘贴的代码没有提供合适的攻击。我对此进行调查的方法是扫描MySQL二进制日志中的相关DROP TABLE语句,以给我一个时间戳。然后,您可以使用该时间戳来查找可以与之关联的 Apache 请求。
然后,只需仔细审核每个候选请求中的代码,直到您确定它:(
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_con
mysql_real_escape_string
评论
我认为这是通过php shell(后门)完成的。 那是共享主机吗?如果是这样,请检查同一服务器上的其他网站是否也受到攻击,这将帮助您了解攻击者是否从您的邻居进入您的网站。要查看服务器上的网站,您需要反向 IP 扫描。
评论
mysql_select_db()