3.SQL 注入之高权限注入(上):从权限原理到跨库攻击,吃透 root 权限注入的危害与防御

在之前的手工注入教程里,我们实现了对当前网站数据库的脱库,但这只是 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 会按照优先级从高到低的顺序验证用户权限,流程如下:

  1. 先查user :如果user表中对应用户的权限为Y,直接生效,不再检查后续表;
  2. user表为N,查db表:看用户对当前数据库有没有权限,有则生效;
  3. db表为N,查tables_priv表:看用户对当前表有没有权限,有则生效;
  4. tables_priv表为N,查columns_priv表:看用户对当前列有没有权限,有则生效;
  5. 所有表都为N,拒绝操作。

划重点:只要user表中某个权限为Y,该用户对所有数据库、表、列都拥有这个权限,这就是 root 权限的核心威力。

3.3 MySQL 权限级别(从大到小)

MySQL 权限分为 4 个层级,对应不同的操作范围:

  1. 全局级权限 :作用于整个 MySQL 实例,所有数据库、表、列,用ON *.*表示(root 的权限就是全局级);
  2. 数据库级权限 :作用于指定的某个数据库,用ON 库名.*表示;
  3. 表级权限 :作用于指定数据库的指定表,用ON 库名.表名表示;
  4. 列级权限 :作用于指定表的指定列,用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 用户分配GRANTFILESUPER等高危权限;
  • 不同网站使用独立的数据库账号,严格隔离权限。

3. 避免共享数据库服务器

不同业务、不同网站使用独立的 MySQL 实例,或严格隔离数据库账号,避免 "一站被打,全站遭殃"。

4. 从根源杜绝 SQL 注入

使用参数化查询(预编译 SQL),彻底避免 SQL 拼接,从源头消除注入漏洞,没有注入点就没有高权限注入的可能。

5. 其他辅助防御

  • 隐藏 MySQL 详细错误信息,避免泄露版本、用户、表结构;
  • 部署 WAF,拦截恶意注入请求,过滤高危 SQL 语句(如union select * from mysql.usergrant all等);
  • 定期代码审计,挖掘潜在的注入漏洞。

八、学习复盘(写给自己,也给入门的你)

这次高权限注入的学习,让我彻底吃透了 SQL 注入的 "进阶玩法":

  • 普通注入是 "偷数据",高权限注入是 "拿服务器控制权",root 权限是最高风险点;
  • MySQL 的权限体系是核心,理解了user表的全局权限和验证顺序,就懂了高权限注入的原理;
  • 最小权限原则是防御的根本,哪怕有注入漏洞,权限不够也无法造成严重危害;
  • 这篇是高权限注入(上),重点讲权限原理、跨库攻击、权限操控,下一篇会详细讲高权限注入的文件读写、写 webshell、提权到服务器权限等进阶操作,彻底打通从注入到拿服务器权限的全流程。
相关推荐
m0_738120722 小时前
渗透基础知识ctfshow——Web应用安全与防护(第二章)
服务器·前端·安全·web安全·php
鹅天帝2 小时前
20260407网安学习日志——序列化漏洞
前端·学习·web安全·网络安全·xss
爱思考的发菜_汽车网络信息安全2 小时前
汽车网络安全:ECC算法详细解析
安全·web安全·汽车
芯盾时代2 小时前
政务行业面临的网络风险
网络·数据库·网络安全
运维行者_3 小时前
MSP网络管理破局者:IPAM+SPM插件终结IP冲突与安全威胁
运维·服务器·开发语言·网络·安全·web安全·php
买大橘子也用券3 小时前
第一届 Polaris CTF 招新赛(部分web) wp
web安全·网络安全
李豆豆喵3 小时前
008-基础入门-不回显不出网&演示环境&源码项目等
web安全
不灭锦鲤16 小时前
网络安全学习(面试)
学习·安全·web安全
菩提小狗21 小时前
每日安全情报报告 · 2026-04-06
网络安全·漏洞·cve·安全情报·每日安全