跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何应对针对MariaDB的特有SQL注入技巧_针对性配置安全过滤开关

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 管理账号不该有这两项。 防SQL注入的php类库 防SQL注入的php类库 下载 查高危权限用户:
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 在门口。

相关文章