一次"走进误区"的SQL注入
字数 939 2025-08-29 08:32:24

MSSQL注入实战:从误区到突破

0x00 背景介绍

这是一次典型的MSSQL注入测试经历,作者通过自身实践展示了从工具使用到手工注入的全过程,特别记录了在测试过程中遇到的误区及突破方法。本案例涉及时间盲注、报错注入等技术,并重点分析了"出库不出表"现象的成因及解决方案。

0x01 初步探测

目标系统特征

  • 输入号码后系统会发起两个独立查询:
    1. 检查卡号是否存在(返回0或1)
    2. 查询卡号对应的个人信息
  • 初步判断存在数据库查询操作

自动化工具测试

使用sqlmap时的关键参数:

--delay 10          # 设置请求间隔,避免触发WAF
--time-sec 15       # 时间盲注延时设置
--timeout 20        # 超时设置
--tamper            # 使用混淆脚本绕过防护

注意:自动化工具测试未发现注入点,可能原因:

  1. 自带tamper脚本未能构造有效payload
  2. 需要更精确的手工测试确定过滤规则

0x02 手工注入过程

数据库类型识别

尝试payload:

'and @@version
' and @@version -- 

返回语法错误,但通过报错信息可辅助判断数据库类型。

有效payload构造

成功payload:

' and @@version>0 and '1'='1

原理:利用数据库查询优先级,内置函数优先执行

数据库信息收集

确认数据库类型为MSSQL后,使用以下payload收集信息:

and db_name() > 0 and '1'='1      -- 当前数据库名
and user_name()>0 and '1'='1      -- 当前用户名
and @@servername >0 and '1'='1    -- 主机名

0x03 关键突破:AND与OR逻辑差异

现象描述

进行到爆表阶段时,发现无论怎么构造payload都没有回显,疑似"出库不出表"现象。

根本原因分析

  1. 系统两个查询独立:

    • 查询1:检查ID是否存在(返回0或1)
    • 查询2:查询ID对应信息(存在则返回数据,不存在返回空数组[])
  2. 逻辑连接词影响:

    • OR连接:无论ID查询结果是0还是1,都会触发后续比较操作
    • AND连接
      • ID查询为0 → 整个条件为0,不执行后续比较
      • ID查询为1 → 执行后续比较,可能触发报错

解决方案

使用存在的用户ID(可通过社会工程学获取)确保查询1返回1,使AND连接的后续条件能够执行。

0x04 完整注入流程

1. 爆数据库名

and (SELECT top 1 Name FROM Master..SysDatabases) > 0

2. 爆表名

and (select top 1 name from [数据库名].sys.all_objects where type='U' AND is_ms_shipped=0) > 0

3. 爆字段名

and (select top 1 COLUMN_NAME from [数据库名].information_schema.columns where TABLE_NAME='表名') > 0

0x05 经验总结

  1. 理解查询流程:明确系统各查询环节的独立性及逻辑关系
  2. 注意连接词选择:AND/OR对注入结果有决定性影响
  3. 合理使用社会工程学:获取有效ID可大幅提高注入成功率
  4. 报错信息利用:即使语法错误,报错信息也可能包含有价值线索
  5. 优先级利用:数据库内置函数执行优先级高于常规查询

0x06 参考资源

MSSQL注入速查表

MSSQL注入实战:从误区到突破 0x00 背景介绍 这是一次典型的MSSQL注入测试经历,作者通过自身实践展示了从工具使用到手工注入的全过程,特别记录了在测试过程中遇到的误区及突破方法。本案例涉及时间盲注、报错注入等技术,并重点分析了"出库不出表"现象的成因及解决方案。 0x01 初步探测 目标系统特征 输入号码后系统会发起两个独立查询: 检查卡号是否存在(返回0或1) 查询卡号对应的个人信息 初步判断存在数据库查询操作 自动化工具测试 使用sqlmap时的关键参数: 注意 :自动化工具测试未发现注入点,可能原因: 自带tamper脚本未能构造有效payload 需要更精确的手工测试确定过滤规则 0x02 手工注入过程 数据库类型识别 尝试payload: 返回语法错误,但通过报错信息可辅助判断数据库类型。 有效payload构造 成功payload: 原理 :利用数据库查询优先级,内置函数优先执行 数据库信息收集 确认数据库类型为MSSQL后,使用以下payload收集信息: 0x03 关键突破:AND与OR逻辑差异 现象描述 进行到爆表阶段时,发现无论怎么构造payload都没有回显,疑似"出库不出表"现象。 根本原因分析 系统两个查询独立: 查询1:检查ID是否存在(返回0或1) 查询2:查询ID对应信息(存在则返回数据,不存在返回空数组[ ]) 逻辑连接词影响: OR连接 :无论ID查询结果是0还是1,都会触发后续比较操作 AND连接 : ID查询为0 → 整个条件为0,不执行后续比较 ID查询为1 → 执行后续比较,可能触发报错 解决方案 使用存在的用户ID(可通过社会工程学获取)确保查询1返回1,使AND连接的后续条件能够执行。 0x04 完整注入流程 1. 爆数据库名 2. 爆表名 3. 爆字段名 0x05 经验总结 理解查询流程 :明确系统各查询环节的独立性及逻辑关系 注意连接词选择 :AND/OR对注入结果有决定性影响 合理使用社会工程学 :获取有效ID可大幅提高注入成功率 报错信息利用 :即使语法错误,报错信息也可能包含有价值线索 优先级利用 :数据库内置函数执行优先级高于常规查询 0x06 参考资源 MSSQL注入速查表