使用UNION语句的SQL注入攻击目的是什么?我的PHP应用正受其攻击
攻击者的攻击目的及后续防护建议
一、攻击者的核心目的
攻击者当前的操作处于UNION注入的探测阶段,具体目标分为以下几步:
- 探测原SQL查询的列数:你收到的
SELECT语句列数不一致报错,正是攻击者在尝试匹配UNION前后查询的列数——只有列数完全匹配时,数据库才会返回合并后的结果,这是后续提取数据的必要前提。 - 提取敏感数据:一旦列数匹配,攻击者会替换
CONCAT(...)中的内容,转而查询数据库核心信息,比如:- 数据库版本、当前连接用户的权限等级
user表中的密码哈希(若存在)- 其他业务表的敏感数据(如用户手机号、订单信息、后台管理员账号等)
- 实施高危操作:如果数据库用户权限足够,攻击者还可能执行更危险的行为:
- 向服务器写入webshell以获取服务器控制权
- 执行系统命令篡改服务器文件
- 删除或篡改数据库中的核心业务数据
二、现有防护的不足及补充措施
你当前通过$_SERVER['REMOTE_ADDR']封禁IP的做法能拦截固定IP的攻击者,但攻击者可通过代理、VPN更换IP轻松绕过,需结合以下核心防护手段:
- 修复SQL注入根源(最关键):立即替换直接拼接SQL的写法,改用预处理语句+参数绑定,示例(PDO写法):
// 错误写法(存在注入风险) $sql = "select username from user where username = '$username'"; // 正确写法(预处理防注入) $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '数据库账号', '数据库密码'); $stmt = $pdo->prepare("select username from user where username = ?"); $stmt->execute([$username]); $result = $stmt->fetch(); - 严格输入验证:对用户名输入做规则校验,比如仅允许字母、数字、下划线,限制长度,拒绝包含
UNION、SELECT、单引号等特殊关键字/字符的输入(注意:这只是辅助手段,不能替代预处理)。 - 关闭前端详细错误提示:在PHP配置中设置
display_errors = Off,仅将错误记录到服务器日志,避免攻击者利用报错信息进一步探测数据库结构。 - 最小化数据库权限:给连接应用的数据库用户分配最小必要权限,比如仅允许查询
user表,禁止FILE、EXECUTE等高风险权限,降低攻击成功后的危害范围。 - 定期审计:定期检查数据库日志和服务器访问日志,排查异常查询;同时核查数据库中的数据是否存在篡改、新增的异常记录。
内容的提问来源于stack exchange,提问作者MGibbons
相关产品推荐
相关产品推荐

