电脑生活派
柔彩主题三 · 更轻盈的阅读体验

SQL注入写入shell:原理与防范

发布时间:2025-12-16 12:26:32 阅读:258 次

老张是个小型电商网站的管理员,平时忙完订单就喜欢泡杯茶看看后台日志。某天他发现服务器磁盘空间突然爆满,进去一查,根目录下多了个叫 webshell.php 的文件。点开一看,里面全是看不懂的PHP代码,但明显不是他上传的。折腾了半天才意识到,网站可能被通过SQL注入写入了shell。

什么是SQL注入写入shell

简单说,攻击者利用网站对用户输入过滤不严的漏洞,把恶意SQL语句拼接到正常查询中。如果数据库权限配置不当,他们就能借助 into outfile 这类语法,把一段Web Shell代码直接写进服务器的某个可访问路径。

比如你有个搜索功能,后端代码是这样拼接SQL的:

$sql = "SELECT * FROM products WHERE name LIKE '%" . $_GET['keyword'] . "%'";

攻击者在搜索框输入:' UNION SELECT '<?php @eval($_POST[cmd]);?>',2,3 INTO OUTFILE '/var/www/html/shell.php',如果数据库有写文件权限,一个可远程控制的后门就生成了。

为什么能成功

这种攻击能成,往往是因为几个“巧合”凑一块了:程序没用预编译语句、数据库账户权限过大(比如用了root)、web目录可写、甚至服务器没关magic_quotes_gpc这类防护。

想象一下,就像你家门锁是坏的(SQL注入漏洞),钥匙还随便借人用(高权限账户),别人不仅进来翻东西,还能在客厅墙上贴张纸条写‘随时欢迎再来’(写入shell)。

怎么防止被写shell

最基础的是参数化查询。别再拼字符串了,改用PDO或MySQLi的预处理机制:

$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%" . $keyword . "%"]);

另外,数据库账号要遵循最小权限原则。Web应用用的数据库用户,不需要file权限就别给。就像你不会拿家里的万能钥匙去开快递柜。

定期检查web目录下的异常PHP文件也很关键。可以写个脚本扫描最近修改的.php文件,或者用git监控变动。老张后来就在部署流程里加了这一步,果然又揪出一个隐藏很深的后门文件。

发现被写入了怎么办

第一反应不是删文件,而是先断网、保留现场。那个webshell.php可能是诱饵,真后门说不定藏在图片文件里。得从日志入手,查清楚是从哪个接口进来的,有没有其他账户被窃取。

修复漏洞后,还得改所有相关密码,包括数据库、后台登录、服务器SSH。别嫌麻烦,就像家里被盗后换锁一样,省这一步可能下次还会出事。

安全这事,平时看不见效果,出了问题就是大事。与其等被黑了再折腾,不如早点把SQL注入的口子堵上。