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