MySQL如何防范利用存储过程进行权限提升的攻击?

P粉602998670

P粉602998670

2026-07-03

536人浏览

原创

definer会引发权限提升,因其使存储过程以定义者而非调用者身份执行;若低权限用户创建definer='root'@'%'的过程,调用时即获得root权限,可悄无声息删库、读取系统表或写文件。

mysql如何防范利用存储过程进行权限提升的攻击?

为什么DEFINER会引发权限提升?

MySQL存储过程默认以DEFINER身份执行,不是调用者。如果低权限用户能创建或修改一个DEFINER = 'root'@'%'的过程,调用时就直接获得root权限——哪怕该用户自己连SELECT都没被授权。

常见错误现象不是报错,而是悄无声息地删库、读取mysql.user、写文件(通过SELECT ... INTO OUTFILE),因为执行上下文已切换。

  • DEFINER在备份恢复、主从同步中会被原样复制,高权限上下文可能被带到新环境
  • MySQL不校验DEFINER账号是否真实存在、是否拥有对应权限
  • 只要用户有CREATE ROUTINEEXECUTE权限,就可能被利用植入恶意过程

如何安全设置SQL SECURITY?

不要依赖默认行为,显式声明安全模型才是可控的起点。

  • 新建过程时强制使用:CREATE DEFINER = CURRENT_USER SQL SECURITY INVOKER PROCEDURE p1() —— 这样过程以调用者权限运行,不会越权
  • 避免写死DEFINER = 'root'@'%';如必须指定,限定为最小必要账号,例如'proc_admin'@'localhost',且该账号仅授予过程所需的具体库表权限
  • 全局禁止普通用户指定任意DEFINER:回收SET USER类权限,确保mysql.proc表不可被非管理员直接更新

怎么检查现有高危存储过程?

线上环境很可能已经存在隐患,得主动扫描。

MySQL(Linux)
MySQL(Linux)

MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。

下载

执行这条语句查出所有DEFINER权限过高的过程:

SELECT name, definer, security_type FROM mysql.proc WHERE security_type = 'DEFINER';
  • 重点排查definer字段包含'root''%' 或未限制host的项
  • 对确认高危的过程,用SHOW CREATE PROCEDURE proc_name查看定义,再用DROP PROCEDURE + 重建方式修正SQL SECURITY INVOKER
  • 注意:mysql.proc表在MySQL 8.0+中已被information_schema.ROUTINES替代,查询需适配版本

动态SQL里参数和标识符怎么防注入?

存储过程里用PREPARE拼接SQL时,数据值和语法结构必须分开处理——混在一起就是后门。

  • 所有用户输入的数据值(WHERE条件、INSERT值等)必须走?占位符:EXECUTE stmt USING @val,严禁CONCAT(..., in_name, ...)
  • 表名、列名、ORDER BY字段、LIMIT偏移量等标识符不能用?,必须白名单校验:IF in_table NOT IN ('users', 'orders') THEN SIGNAL SQLSTATE '45000' ...
  • USING后面只能跟用户变量(@xxx),不能直接写存储过程参数;要先SET @param = in_param;再传入
  • @xxx变量类型隐式转换容易静默失败,建议显式转换:SET @id = CAST(in_id AS UNSIGNED);

最易被忽略的是:SQL SECURITY INVOKER只解决权限问题,不解决SQL注入;而DEFINER滥用和动态SQL拼接是两条独立攻击路径,得同时堵住。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1118

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

754

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

472

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

1355

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

1880

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

617

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

2223

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

1944

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

2374

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 124人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 224人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习