在之前的手工注入教程里,我们实现了对当前网站数据库的脱库,但这只是 SQL 注入的 "基础操作"。当我们拿到 **MySQL 最高权限(root)** 时,就能实现更危险的「高权限注入」:不仅能偷当前网站的数据,还能跨库攻击同服务器的所有网站、操控数据库权限、读写服务器文件,甚至拿下服务器权限。
这篇博客结合 sqli-labs 靶场实操,从原理、权限体系、攻击流程到防御方案,彻底搞懂高权限注入的核心逻辑,既是自己的深度复盘,也给入门的小伙伴一份完整的学习指南。
一、什么是高权限注入?(大白话 + 专业定义)
🗣️ 大白话解释
你可以把 MySQL 服务器理解成一个大仓库:
- 普通 SQL 注入:相当于拿到了 ** 单个房间(单个网站数据库)** 的钥匙,只能偷这个房间里的东西;
- 高权限注入:相当于拿到了仓库大门的总钥匙(root 权限),仓库里所有房间(同服务器所有网站的数据库)都能随便进,还能改锁、加新钥匙、甚至拆仓库。
📚 专业定义
高权限注入是指:当 Web 应用以高权限数据库用户(通常为 root)连接数据库时,攻击者通过 SQL 注入漏洞,获取该高权限账号的完整操作能力,进而实现跨库查询、权限操控、文件读写、服务器提权等高危操作的注入攻击。
🔍 核心攻击场景
很多企业 / 虚拟主机商会让多个网站共享同一个 MySQL 服务器 :
- 网站 A、网站 B 共用一台 MySQL 服务器,各自有独立的数据库(数据库 A、数据库 B);
- 如果网站 A 存在 SQL 注入漏洞,且网站 A 用
root账号连接数据库; - 攻击者就能通过网站 A 的注入点,拿到 root 权限,进而直接访问、窃取网站 B 的数据库,实现 "打一个站,拿所有站的数据"。
二、高权限注入的核心前提(靶场源码拆解)
高权限注入不是想做就能做,必须满足 3 个核心前提,我们以 sqli-labs 靶场为例拆解:
1. 前提 1:Web 应用存在 SQL 注入漏洞
和普通注入一样,必须有可控的注入点(比如 URL 的id参数),能让我们拼接恶意 SQL 语句。
2. 前提 2:Web 应用以高权限账号连接数据库(最关键!)
这是高权限注入的核心,我们看 sqli-labs 的连接源码
如上所示 引入了另外一个文件 我们打开这个文件
// db-creds.inc 数据库配置文件
$dbuser = 'root'; // 用root账号连接
$dbpass = 'root'; // root密码
$dbname = "security";
$host = 'localhost';
可以看到:
root是 MySQL 的最高权限账号,拥有对整个 MySQL 实例的所有操作权限;- 用 root 连接的 Web 应用,一旦被注入,攻击者就直接获得了 root 的所有权限,能操作服务器上的所有数据库。
3. 前提 3:MySQL 5.0 + 版本
MySQL 5.0 以上才内置了information_schema(元数据库)和mysql系统库,让我们可以查询所有库、表、用户权限信息,实现跨库攻击。
三、MySQL 权限体系详解(高权限注入的核心原理)
要搞懂高权限注入,必须先吃透 MySQL 的权限体系,这是所有操作的基础。
3.1 MySQL 的 4 大核心权限表
MySQL 的权限都存储在mysql系统库中(对应第三张图,mysql库被标红,是核心系统库),核心有 4 张权限表,权限优先级从高到低:



| 权限表 | 作用 | 权限范围 |
|---|---|---|
user表 |
全局权限表,存储所有用户的账号、密码、全局权限 | 整个 MySQL 实例(所有数据库、表、列) |
db表 |
数据库级权限表,存储用户对指定数据库的权限 | 指定单个数据库 |
tables_priv表 |
表级权限表,存储用户对指定表的权限 | 指定数据库的指定表 |
columns_priv表 |
列级权限表,存储用户对指定列的权限 | 指定表的指定列 |
procs_priv表 |
存储过程 / 函数级权限表 | 指定存储过程 / 函数 |
💡 大白话解释
user表:公司老板表,老板(root)对公司所有部门(所有数据库)有全部权限;db表:部门经理表,经理只对自己的部门(指定数据库)有管理权;tables_priv表:组长表,组长只对自己的小组(指定表)有管理权;columns_priv表:员工表,员工只能看自己工位的文件(指定列)。
3.2 MySQL 权限验证顺序(面试必背)
MySQL 会按照优先级从高到低的顺序验证用户权限,流程如下:

- 先查
user表 :如果user表中对应用户的权限为Y,直接生效,不再检查后续表; user表为N,查db表:看用户对当前数据库有没有权限,有则生效;db表为N,查tables_priv表:看用户对当前表有没有权限,有则生效;tables_priv表为N,查columns_priv表:看用户对当前列有没有权限,有则生效;- 所有表都为
N,拒绝操作。
划重点:只要
user表中某个权限为Y,该用户对所有数据库、表、列都拥有这个权限,这就是 root 权限的核心威力。
3.3 MySQL 权限级别(从大到小)
MySQL 权限分为 4 个层级,对应不同的操作范围:
- 全局级权限 :作用于整个 MySQL 实例,所有数据库、表、列,用
ON *.*表示(root 的权限就是全局级); - 数据库级权限 :作用于指定的某个数据库,用
ON 库名.*表示; - 表级权限 :作用于指定数据库的指定表,用
ON 库名.表名表示; - 列级权限 :作用于指定表的指定列,用
ON 库名.表名(列名)表示。
四、权限相关核心 SQL 实操(靶场实战语句)
结合 sqli-labs 靶场的实操,整理所有权限相关的核心 SQL 语句,可直接复制使用:
1. 查看用户与权限
-- 1. 查看MySQL中所有用户
select user,host from mysql.user;
-- 执行结果:能看到root@localhost、mysql.sys@localhost等用户
-- 2. 查看指定用户的详细权限(\G用于格式化输出,方便查看)
select * from user where user='root' and host='localhost'\G;
-- 执行结果:root的所有权限(Select_priv、Insert_priv等)都是Y,代表拥有所有权限(对应第四张图)

2. 创建用户与授权
-- 1. 创建新用户test1,密码12345,仅允许本地登录(新用户默认无任何权限)
CREATE USER 'test1'@'localhost' IDENTIFIED BY '12345';
-- 执行后,test1登录后show databases,只能看到information_schema(对应第五、六张图)
-- 2. 给test1提权,授予所有全局权限(和root权限一致)
GRANT ALL PRIVILEGES ON *.* TO 'test1'@'localhost' WITH GRANT OPTION;
-- WITH GRANT OPTION:允许该用户给其他用户授权,提权后test1能看到所有数据库(对应第六张图)
-- 3. 给test2授予列级权限:仅允许查询test库t1表的id列
grant select(id) on test.t1 to test2@localhost identified by '123456';
-- 执行后,test2 select * from t1会报错,仅能执行select id from t1(对应第七、八张图)
3. 删除用户
-- 删除指定用户
drop user finley@'localhost';
五、高权限注入的核心危害
当我们通过注入拿到 root 权限后,能实现以下高危操作:
1. 跨库攻击(最常见的危害)
同一个 MySQL 服务器上的所有网站的数据库都能被窃取,比如:
- 网站 A 有注入漏洞,用 root 权限注入;
- 直接通过
union select查询同服务器网站 B 的数据库,拖走所有用户数据,实现 "打一站,拿所有站"。
2. 权限操控
- 创建新的高权限用户,后续直接登录数据库;
- 给普通用户提权,甚至篡改 root 密码,完全控制数据库服务器;
- 删除任意用户、权限,破坏业务系统。
3. 文件读写(下一篇详细讲)
root 权限默认拥有File_priv文件读写权限,能:
- 读取服务器上的敏感文件(比如 /etc/passwd、网站配置文件);
- 写入 webshell 到 Web 目录,直接拿到服务器权限,实现从数据库到服务器的提权。
4. 数据破坏
任意修改、删除所有数据库的数据,甚至执行drop database删库跑路,彻底摧毁业务系统。
六、高权限注入的标准流程(对应思维导图)
结合思维导图,高权限注入分为 3 个核心阶段:

阶段 1:信息收集
- 查数据库版本:
version(),确认 5.0+,支持系统库; - 查当前用户:
select user(),current_user();,确认是否为 root@localhost; - 查所有数据库:
show databases;(union 查询),枚举同服务器的所有网站数据库; - 查 mysql 库的用户信息:
select user,host,password from mysql.user;,获取所有用户的账号密码。
阶段 2:数据注入
- 低版本 MySQL(<5.0):无 information_schema,只能暴力猜表、结合文件读取查询;
- 高版本 MySQL(≥5.0):用 information_schema 系统库,跨库查询其他网站的表、列、数据。
阶段 3:高权限注入
- 跨库查询:直接查询其他数据库的敏感数据;
- 文件读写:读写服务器文件,写 webshell(下一篇详细讲);
- 权限操控:创建用户、提权、删用户等。
七、高权限注入的企业级防御方案(面试 / 笔试必背)
高权限注入的防御核心是最小权限原则,从根源上降低风险:
1. 绝对禁止 Web 应用使用 root 账号连接数据库(最核心!)
给 Web 应用创建专用的数据库账号,仅分配最小必要权限:
-- 创建Web专用账号,仅允许本地登录
CREATE USER 'webuser'@'localhost' IDENTIFIED BY '强密码';
-- 仅授予security库的查询、插入、更新、删除权限,不给全局权限、file权限、grant权限
GRANT SELECT,INSERT,UPDATE,DELETE ON security.* TO 'webuser'@'localhost';
即使被注入,攻击者也只能操作 security 库,无法跨库、提权、读写文件。
2. 严格权限管控
- 定期审计
mysql.user表,删除无用的测试用户、弱密码用户; - 禁止给 Web 用户分配
GRANT、FILE、SUPER等高危权限; - 不同网站使用独立的数据库账号,严格隔离权限。
3. 避免共享数据库服务器
不同业务、不同网站使用独立的 MySQL 实例,或严格隔离数据库账号,避免 "一站被打,全站遭殃"。
4. 从根源杜绝 SQL 注入
使用参数化查询(预编译 SQL),彻底避免 SQL 拼接,从源头消除注入漏洞,没有注入点就没有高权限注入的可能。
5. 其他辅助防御
- 隐藏 MySQL 详细错误信息,避免泄露版本、用户、表结构;
- 部署 WAF,拦截恶意注入请求,过滤高危 SQL 语句(如
union select * from mysql.user、grant all等); - 定期代码审计,挖掘潜在的注入漏洞。
八、学习复盘(写给自己,也给入门的你)
这次高权限注入的学习,让我彻底吃透了 SQL 注入的 "进阶玩法":
- 普通注入是 "偷数据",高权限注入是 "拿服务器控制权",root 权限是最高风险点;
- MySQL 的权限体系是核心,理解了
user表的全局权限和验证顺序,就懂了高权限注入的原理; - 最小权限原则是防御的根本,哪怕有注入漏洞,权限不够也无法造成严重危害;
- 这篇是高权限注入(上),重点讲权限原理、跨库攻击、权限操控,下一篇会详细讲高权限注入的文件读写、写 webshell、提权到服务器权限等进阶操作,彻底打通从注入到拿服务器权限的全流程。






