MySQL系列知识全景复习:从SQL四大分类到information_schema信息收集,从UNION/报错/盲注/万能密码四种注入方式到文件读写与secure_file_priv防线,从用户权限体系到完整攻击链五步走,配合十大面试题要点与纵深防御加固建议,一篇串起全部核心知识。
一、数据库基础回顾
1.1 SQL 四大分类
| 分类 | 全称 | 作用 | 口诀 |
|---|---|---|---|
| DDL | 数据定义语言 | 改结构(建库建表) | 改结构 |
| DML | 数据操作语言 | 改数据(增删改) | 改数据 |
| DQL | 数据查询语言 | 查数据(SELECT) | 查数据 |
| DCL | 数据控制语言 | 控权限(GRANT/REVOKE) | 控权限 |
1.2 常用连接与命令
sql
-- 本地连接
mysql -u root -p
-- 远程连接(端口用大写 -P)
mysql -h 127.0.0.1 -P 3306 -u root -p
| 命令 | 作用 |
|---|---|
| SHOW DATABASES | 查看所有数据库 |
| USE school | 切换数据库 |
| SHOW TABLES | 查看当前库所有表 |
| SELECT DATABASE() | 查看当前数据库 |
| DESC students | 查看表结构 |
| SHOW CREATE TABLE students | 查看建表语句 |
易错点:SQL 语句必须以英文分号结尾;mysql -p 后不要加空格和明文密码;命令行密码输入无回显是正常安全机制。
二、信息收集:摸清陌生数据库
2.1 information_schema 三张核心表
| 系统表 | 存储内容 | 关键字段 |
|---|---|---|
| schemata | 所有数据库名 | schema_name |
| tables | 所有表名 | table_name, table_schema |
| columns | 所有字段名 | column_name, table_schema, table_name |
2.2 信息收集三步走
sql
-- 第一步:查库名
SELECT schema_name FROM information_schema.schemata;
-- 第二步:查表名
SELECT table_name FROM information_schema.tables WHERE table_schema = 'school';
-- 第三步:查字段名
SELECT column_name FROM information_schema.columns
WHERE table_schema = 'school' AND table_name = 'admin_users';
看到注入点后,第一步永远是信息收集------先知道库里有什么,再决定拿什么数据。
三、四种数据出口对比
| 方式 | 适用场景 | 核心原理 | 关键点 |
|---|---|---|---|
| UNION 联合查询 | 页面有回显 | 合并两个 SELECT 结果 | 列数必须一致,类型兼容 |
| 报错注入 | 无回显但显示报错 | 利用错误信息带出数据 | updatexml、extractvalue 等函数 |
| 盲注 | 无回显也无报错 | 页面正常/异常判断真假 | 效率低,但有效 |
| 万能密码 | 只需绕过登录 | 闭合引号→恒真条件→注释截断 | 依赖具体 SQL 拼接方式 |
选择逻辑:有回显用 UNION,有报错用报错注入,什么都没有才用盲注,只想绕登录用万能密码。
四、文件读写:从数据泄露到服务器沦陷
4.1 方向与本质
| 操作 | 方向 | 本质 |
|---|---|---|
| LOAD_FILE() | 服务器文件 → 查询结果 | 读服务器上的文件 |
| INTO OUTFILE | 查询结果 → 服务器文件 | 写文件到服务器磁盘 |
| INTO DUMPFILE | 原始字节 → 服务器文件 | 原样写入,不加分隔符 |
关键认知:LOAD_FILE() 读的是 MySQL 服务器上的文件,不是你自己电脑上的文件。如果数据库在远程服务器上,读的是远程数据库服务器的文件。
4.2 写文件的前提条件
- 当前账号有 FILE 权限
- secure_file_priv 允许写入目标目录
- MySQL 服务进程对目标目录有写权限
- 目标文件不存在(INTO OUTFILE 不能覆盖)
- 使用绝对路径
4.3 secure_file_priv 守门员
| 配置值 | 效果 |
|---|---|
| NULL | 完全禁用文件导入导出(最安全) |
| 空值 | 不限制,允许任意目录读写(危险) |
| 指定目录 | 只允许在该目录范围内操作 |
secure_file_priv 不能通过 SET GLOBAL 动态修改,必须改配置文件 my.ini 并重启 MySQL 服务。
五、用户权限与密码安全
5.1 用户身份格式
MySQL 用户是 '用户名'@'主机',例如:
'root'@'localhost':只允许本机连接'root'@'%':允许任意远程主机连接(极度高危)
root@localhost 和 root@% 不是同一个账号。user + host 共同决定一个 MySQL 账号。
5.2 认证与授权
| 概念 | 解决的问题 |
|---|---|
| 认证 | 你是谁,能不能登录 |
| 授权 | 登录后你能做什么 |
5.3 密码存储
- 数据库不存明文密码,存哈希值
- MySQL 5.5 用 password 字段,5.7 用 authentication_string 字段
- 弱密码可以被离线爆破
- 生产环境禁止业务账号读取 mysql.user
- 不要复用数据库密码
六、SQL 注入写 Webshell 完整条件
面试重点------十个条件缺一不可:
- Web 应用存在可利用的 SQL 注入点
- 注入点所在 SQL 能影响 SELECT 查询或执行写文件语句
- 当前数据库账号拥有 FILE 权限
- secure_file_priv 为空或允许写入目标目录
- 已知 Web 根目录的绝对路径
- MySQL 服务进程对 Web 根目录有写权限
- 目标文件名不存在
- Web 服务器会解析写入文件的扩展名(如 .php)
- Web 和数据库没有做有效隔离
- 安全设备、WAF、数据库审计没有拦截相关语句
一句话总结:有 SQL 注入不等于能写 Webshell,中间隔着一堆权限和配置。
七、完整攻击链五步走
| 步骤 | 动作 | 目标 |
|---|---|---|
| 1. 发现注入点 | 单引号、报错、页面差异 | 确认注入存在 |
| 2. 信息收集 | information_schema 查库名、表名、字段名 | 摸清数据库结构 |
| 3. 带出数据 | UNION、报错注入、盲注、万能密码 | 获取业务数据 |
| 4. 判断权限 | SHOW GRANTS、secure_file_priv、FILE 权限 | 评估能否升级 |
| 5. 文件写入 | INTO OUTFILE 写文件,Web 解析 | 服务器控制风险 |
如果写不了 Webshell,退路:继续偷数据(手机号、身份证、订单)、找其他入口(文件上传、RCE)、盲注慢慢猜。
八、面试题要点速览
| 问题 | 核心回答 |
|---|---|
| SQL 注入的本质 | 用户输入被当作 SQL 代码执行,程序把输入直接拼接到 SQL 语句中 |
| UNION 注入前提 | 页面有回显、原查询是 SELECT、列数一致、类型兼容 |
| 报错注入常用函数 | updatexml、extractvalue、floor(rand()) 组合、exp |
| 万能密码原理 | 闭合引号→构造恒真条件→注释截断,让 WHERE 永远为真 |
| 写 Webshell 条件 | 注入点+FILE 权限+secure_file_priv+Web 路径+写权限+目标文件不存在+Web 解析 |
| 怎么防御 SQL 注入 | 核心是参数化查询(预编译语句),辅助:输入校验、最小权限、错误隐藏、WAF |
| LOAD_FILE 读哪里 | MySQL 服务器上的文件,不是客户端本机文件 |
| OUTFILE vs DUMPFILE | OUTFILE 导出查询结果(有分隔符),DUMPFILE 原样写单个字段字节 |
| secure_file_priv 三种状态 | NULL 禁用、空值任意目录、指定目录限制 |
| MySQL 密码存哪 | mysql.user 表,存哈希不存明文 |
加分项:参数化查询是根本,WAF 是应急。只靠 WAF,绕过姿势有很多种。
九、易错点与防御总结
9.1 常见易错点
| 易错点 | 正确理解 |
|---|---|
| 混淆文件读写方向 | LOAD_FILE 读的是服务器文件,不是本机文件 |
| 混淆认证与授权 | 认证=能不能登录,授权=登录后能做什么 |
| 只查 FILE 权限忽略配置 | 还要检查 secure_file_priv 是否限制目录 |
| 忽略版本差异 | 5.5 默认宽松,5.7 默认严格 |
| 以为注入必然高危 | 没有 FILE 权限或 secure_file_priv 限制时,注入只能查数据 |
| -- 后面忘加空格 | -- 注释符后面通常需要跟一个空格 |
9.2 纵深防御体系
| 加固措施 | 具体做法 |
|---|---|
| 参数化查询 | 让用户输入永远不被当作 SQL 代码执行(根本防御) |
| 最小权限原则 | 业务账号只授予必需权限,绝不使用 root |
| 严控 FILE 权限 | 普通业务账号不授予 FILE 权限 |
| 配置 secure_file_priv | 设为 NULL 或独立不可 Web 访问的目录 |
| 隐藏错误信息 | 生产环境不显示数据库报错 |
| 定期排查 | 扫描弱口令、权限漂移和配置失控 |
十、知识全景小结
| 模块 | 核心知识 | 一句话速记 |
|---|---|---|
| 数据库基础 | SQL 四大分类、常用命令 | DDL改结构,DML改数据,DQL查数据,DCL控权限 |
| 信息收集 | information_schema 三张表三步走 | 先查库,再查表,后查字段 |
| UNION 注入 | 列数对齐、类型兼容、回显位 | 有回显用 UNION |
| 报错注入 | 错误信息带出数据 | 有报错用报错注入 |
| 盲注 | 页面真假判断 | 什么都没有才用盲注 |
| 万能密码 | 闭合→恒真→注释 | 只想绕登录用这个 |
| 文件读取 | LOAD_FILE 读服务器文件 | 不是读本机文件 |
| 文件写入 | INTO OUTFILE / DUMPFILE | 需 FILE 权限 + 配置放行 |
| secure_file_priv | 限制导入导出目录 | 关键防线,NULL 最安全 |
| 用户权限 | 用户名@主机,认证与授权 | root@localhost ≠ root@% |
| 密码安全 | 哈希存储,弱密码可爆破 | 不复用、最小权限 |
| 攻击链 | 发现→收集→带出→判断权限→写文件 | 五步走 |
| 防御核心 | 参数化查询 + 最小权限 | 根本是预编译,WAF 是辅助 |
从第一条 SQL 语句到完整攻击链,从 information_schema 到 secure_file_priv,这一篇把 MySQL 安全的全部知识点串成了体系。核心观点:SQL 注入的本质是用户输入被当作代码执行,防御的根本是参数化查询;文件读写风险不是数据库功能本身的问题,而是高权限、弱配置、注入漏洞三者叠加的结果。掌握这套知识框架,无论是做渗透测试还是做安全加固,都能快速定位问题所在。