MariaDB SQL注入防御关键在于关闭高危通道:禁用local_infile、设secure_file_priv为NULL或专用路径、禁用FEDERATED引擎和system()函数、撤销FILE/SUPER权限。

MariaDB 的 SQL 注入防御不能只靠通用规则,它有自己的一套“后门通道”——比如 LOAD DATA LOCAL INFILE、SELECT ... INTO OUTFILE、system() 函数、FEDERATED 引擎,这些在 MySQL 中也存在,但在 MariaDB 里更活跃、默认更宽松。关掉它们,不是防住注入本身,而是让注入成功后没法导出数据、写文件、调系统命令、跨库执行。
必须禁用 local_infile 和 secure_file_priv
这两个开关是攻击者拖库的黄金组合:local_infile=ON 允许客户端发起本地文件读取;secure_file_priv 为空或设为 /tmp 时,INTO OUTFILE 就能任意路径写 shell 或数据库备份。
- 检查当前状态:
SHOW VARIABLES LIKE 'local_infile';和SHOW VARIABLES LIKE 'secure_file_priv'; - 在
/etc/my.cnf.d/server.cnf(或/etc/mysql/mariadb.conf.d/50-server.cnf)的[mysqld]段下添加:[mysqld] local_infile = OFF secure_file_priv = /var/lib/mysql-files/
注意:/var/lib/mysql-files/必须真实存在且仅mysql用户可写,不能是/tmp或空值 - 重启服务:
sudo systemctl restart mariadb,再验证是否生效
禁用 FEDERATED 和 system() 等高危存储引擎与函数
MariaDB 默认启用 FEDERATED,攻击者一旦拿到注入点,可用 CREATE TABLE ... ENGINE=FEDERATED 连接远程恶意 MySQL 实例,绕过网络隔离执行任意查询;system() 函数(需 SYSTEM_VARIABLES_ADMIN 权限)则直接执行系统命令。
- 禁用引擎:在配置中加
disabled_storage_engines = "FEDERATED"(MariaDB 10.2+ 支持) - 禁用
system():该函数属于sys插件,卸载即可:UNINSTALL SONAME 'lib_mysqludf_sys'(前提是没手动装过;若已装,必须删) - 检查是否残留:
SELECT * FROM mysql.func WHERE name = 'system';,有结果就DROP FUNCTION system;
限制用户 file_priv 和 super_priv 权限
file_priv 决定能否用 LOAD_FILE() 或 INTO OUTFILE;super_priv 控制能否修改全局变量(比如临时开启 local_infile)。非 root 管理账号不该有这两项。
- 查高危权限用户:
SELECT user, host, file_priv, super_priv FROM mysql.user WHERE file_priv = 'Y' OR super_priv = 'Y'; - 撤销权限(以非 root 用户为例):
REVOKE FILE ON *.* FROM 'appuser'@'%';,REVOKE SUPER ON *.* FROM 'appuser'@'%'; - 执行
FLUSH PRIVILEGES;生效 - 特别注意:
root@localhost可以保留,但root@%必须删掉或严格限制 host
关闭 .mysql_history 并收紧 datadir 权限
这不是防注入,而是防二次利用:攻击者若通过其他漏洞(如 RCE)进入服务器,.mysql_history 里可能存着 DBA 手动执行过的敏感 SQL;datadir 权限太宽(如 755),则可被低权限进程读取 ibd 文件直接解析表数据。
- 清空并屏蔽历史:
rm -f $HOME/.mysql_history && ln -s /dev/null $HOME/.mysql_history - 查 datadir:
SELECT @@datadir;,通常是/var/lib/mysql - 改权限:
sudo chmod 700 /var/lib/mysql,确保只有mysql用户可进 - 确认属主:
sudo chown -R mysql:mysql /var/lib/mysql
真正危险的从来不是“能不能注入”,而是“注入之后能走多远”。MariaDB 的这些特性,让一次普通注入升级为服务器沦陷。配置开关只是第一道坎,但很多人连这一道都没跨过去——比如把 secure_file_priv 设成 /tmp,等于挂了个写文件的 API 在门口。

















