SQL注入漏洞类型
2026/8/2 3:25:58 网站建设 项目流程

高危核心根源:开发者直接拼接用户输入到SQL语句,没有使用预编译,攻击者能够篡改SQL语义。

基础概念

Payload(载荷):攻击者发送给目标服务器、用来触发漏洞、实现攻击目的的一段指令 / 字符串。
理解:漏洞是 “门锁缺陷”,Payload 就是撬开门锁的工具。
在 SQL 注入场景里,Payload 是我们写入参数里的恶意 SQL 片段,例如1' and sleep(3)、1 union select 1,2全部属于 Payload。
前置前提:注入 Payload 想要生效,首要任务是闭合原有 SQL 语句

漏洞后端原始 SQL 两种典型形式,原始后端 SQL 示例:

SELECT * FROM user WHERE id = 1; # 数字型注入,无需引号闭合 SELECT * FROM user WHERE name = 'test'; # 字符型注入,需要单引号'闭合

攻击者利用 ' / " / ) 截断原有 SQL,追加恶意 Payload,最后用 # 或 --+ 注释掉 SQL 剩余代码,避免语法报错。
注入点不局限于 URL GET 参数;POST 表单、Cookie、HTTP 请求头、JSON 请求体都能传入 Payload。



主流五大注入类型



1. 报错注入(Error-based)

特征:传入特殊payload,网站直接抛出数据库原生报错信息。
示例 Payload:?id=1'页面爆出 MySQL语法错误,泄露表名,字段名
攻击原理:利用 MySQL 特有报错函数updatexml()、extractvalue(),强制数据库在报错信息里返回数据。
局限:网站关闭数据库报错就无法使用。存在 32 字符截断限制,MSSQL、Oracle Payload 不通用。

进阶 Payload:

?id=1' and updatexml(1,concat(0x7e,database()),1)--+


2. 联合查询注入(Union Select)

特征:页面存在数据回显位置,可以直接打印查询结果。
探测列数 Payload:

?id=1 order by 3--+

(核心)攻击 Payload:

?id=1 union select username,password from users

执行逻辑:原始 SQL 查询结果 + union 拼接的恶意查询结果一同展示在页面。
硬性前提:union前后两条查询字段数量必须一致,一般先用order by相关 Payload 探测列数:?id=1 order by 3--+
正常页面会额外打印账号密码
局限:需要页面有位置输出查询结果;很多网站不具备条件。

3. 布尔盲注(Boolean-based)

没有明文数据、没有数据库报错
仅仅存在两种页面状态:正常 / 空白/跳转。

俩组对比Payload:

?id=1 and 1=1 -- 页面正常 ?id=1 and 1=2 -- 页面空白/跳转

攻击原理:借助页面两种不同响应状态,搭配substr()、ascii()函数构造 Payload,逐字符猜测数据库名称、表名、账号密码。

典型猜解 Payload:

?id=1' and ascii(substr(database(),1,1))>100--+


4. 时间盲注(Time-based)

页面视觉上完全没有任何变化,不会空白、不会报错,跳转切换。
依靠页面加载延迟判断Payload内语句真假。
基础延时Payload:

?id=1 and sleep(3)

条件成立 → 网页卡住3秒再加载;
条件不立 → 立刻加载完成。
攻击者依靠页面两种状态,逐字符猜数据库内容
肉眼看不出页面内容区别,只能观察响应耗时。这也是最隐蔽、最难手工测试的注入。

实战猜解 Payload:

?id=1' and if(ascii(substr(database(),1,1))>114,sleep(3),0)--+

特点:隐蔽性最强,肉眼看不出页面差异,手工测试效率极低;WAF 很容易拦截长时间延时 Payload
5. 堆叠查询注入(Stacked Queries)

使用分号;结束当前SQL语句,追加一条全新独立SQL指令。
破坏性Payload:

?id=1; drop table users;

关键限制:语法上 MySQL 支持分号分隔多条 SQL,但能否执行取决于后端数据库驱动(能否使用取决于数据库驱动是否允许多条语句执行)
PHPmysqli_query()默认禁止多条语句;MSSQL(Sql Server)更容易触发堆叠注入;Oracle 默认不支持。
Payload 执行成功,页面不一定返回任何执行结果,不能依靠页面内容判断攻击是否生效。

简单横向对比

1. 能看见数据、报错 → 联合注入 / 报错注入

2. 页面只有两种显示状态(正常/空白) → 布尔盲注

3. 页面毫无视觉差别,只能看加载快慢 → 时间盲注



知识点

1.五类注入底层根源完全一致:直接拼接用户输入;只是网站错误处理机制、页面展示逻辑不同,Payload 利用形式产生区别。
2.sqlmap 工具会自动构造对应 Payload,自动识别注入类型,自动化完成盲注数据猜解。
3.水平越权 ≠ SQL 注入
-水平越权:业务权限设计缺陷,仅修改 ID 访问他人数据;SQL 语句本身安全,没有可供利用的 Payload,sqlmap 无法扫描出来。
-SQL 注入:可控输入让攻击者注入恶意 Payload,篡改数据库执行逻辑;两者漏洞可以同时存在、互不包含。

拓展注入(不在五大主流分类,实战高频)
二次 SQL 注入
前端对输入 Payload 做转义过滤,恶意字符先存入数据库;后续读取数据再次拼接 SQL 时,Payload 触发注入,可以绕过前端防护。
OAST 外带注入(高阶盲注 Payload)
当延时 Payload 被 WAF 拦截、页面无任何状态差异时使用;构造 Payload 触发 DNS/HTTP 请求,把数据库数据带出,摆脱页面限制。

防御方案
1.最优方案:全程使用预编译参数化查询,彻底隔离 SQL 结构与用户输入,让攻击者传入的 Payload 只会被当做普通字符串,无法修改 SQL 语法;
2.数据库账号最小权限:业务账号禁止drop、文件读写等高危险操作,降低 Payload 攻击造成的损失;
3.生产环境关闭详细数据库错误堆栈,切断报错注入利用条件;
4.特殊字符过滤仅作为辅助防护,不能单独依靠过滤抵御 Payload,存在大量绕过手段。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询