1. 定义
SQL 注入(SQL Injection,简称 SQLi)是Web 层最经典高危漏洞,核心成因: 网站后端直接把用户可控输入,拼接进 SQL 语句执行,没有过滤、转义、预处理防护。攻击者构造特殊 SQL 语句片段插入输入框,篡改原有数据库查询逻辑,实现非法查数据、删库、拿服务器权限等恶意操作。
简单一句话:用户输入被当成 SQL 代码执行了,本应只当普通文本。
2. 漏洞产生根本条件(缺一不可)
- 用户可控输入:URL 参数、登录账号密码框、Cookie、请求头、搜索框等,用户能随便改;
- 后端代码直接字符串拼接 SQL,没有参数化查询(预编译);
- 输入未做转义、过滤、特殊字符转义处理。
3. 正常逻辑 vs 注入恶意逻辑举例(登录页面最典型)
正常后台 PHP 逻辑(危险写法)
$name = $_GET['user']; $pwd = $_GET['pass']; // 直接拼接输入到SQL $sql = "select * from user where username='$name' and password='$pwd'";正常用户输入
账号:admin 密码:123456 拼接后 SQL:
select * from user where username='admin' and password='123456'只会查询 admin 账号,验证密码。
攻击者注入恶意输入
账号输入:admin' or 1=1 --密码随便填 111 拼接后 SQL 变成:
select * from user where username='admin' or 1=1 -- ' and password='111'拆解作用:
'闭合前面原有单引号,破坏原有语句结构;or 1=1永真条件,整条 where 永远成立;--SQL 注释符,把后面剩余代码全部注释失效。 最终效果:无需正确密码,直接登录后台管理员账号。
4. SQL 注入能做什么危害
- 泄露全部数据库数据:用户账号、手机号、身份证、订单、后台管理员密码;
- 篡改数据:修改网站价格、管理员权限;
- 删除数据:
drop table 表名直接清空数据表; - 读取服务器本地文件(load_file)、写入后门木马(outfile),拿下服务器;
- 内网探测、提权,横向渗透整个服务器集群。
5. 常见注入分类
- 联合查询注入(Union 注入)页面有数据回显,用 union select 拼接查询,直接爆出库、表、字段数据。
- 布尔盲注页面无数据,但返回两种不同页面(正常 / 报错),通过判断真假逐字符猜数据库内容。
- 时间盲注页面完全无差异,用 sleep () 延时函数,根据页面加载延迟判断字符对错。
- 报错注入利用 updatexml/extractvalue 等函数,让数据库报错时带出查询数据。
- Cookie 注入、POST 注入、HTTP 头注入 注入点不在 URL,在 Cookie、POST 表单、User-Agent、Referer 等请求头。