You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:55:38