ProxySQL 2.0.9 引入了 libsqlinjection 作为识别可能的 SQL 注入攻击的机制。
启用 SQL 注入检测
要启用 SQL 注入检测,只需要启用变量 mysql-automaticdetectsqli
SQL 注入检测和防火墙白名单
即使启用了变量 mysql-automaticdetectsqli,SQL 注入引擎也不会检查所有的查询操作。因为,SQL 注入引擎不会检查防火墙白名单允许的操作。因为它已经是被认为是安全的,所以就不会检查。
换句话说,如果启用了 SQL 注入的自动检测(mysql-automaticdetectsqli=1):
如果防火墙白名单是关闭的,SQL 注入引擎会分析所有的操作。
如果防火墙白名单是启用的,SQL 注入引擎只会分析白名单之外的操作,并且会以"DETECTING"模式为用户执行,实际上: - 模式为"OFF"的用户,所有的操作都被认为是白名单上的。 - 模式为"PROTECTING"的用户,不在白名单的操作会被拒绝。
表 mysqlfirewallwhitelistsqlifingerprints
libsqlinjection 解析查询,生成查询的指纹,并确定该指纹是已知的 SQL 注入攻击还是可能的攻击。
尽管 libsqlinjection 能够检测到很多 SQL 注入,但是不幸的是,它还会产生很多误报。
将 SQL 注入检测与防火墙白名单结合使用可以大大减少误报(所有列入白名单的查询都不会由 SQL 注入引擎处理),这是减少误报数量的最佳方法。
减少误报数量的另一种方法是将 libsqlinjection 生成的某些指纹列入白名单。可以在表中将指纹列入白名单 mysqlfirewallwhitelistsqlifingerprints:
CREATE TABLE mysql_firewall_whitelist_sqli_fingerprints (
active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
fingerprint VARCHAR NOT NULL,
PRIMARY KEY (fingerprint) )
active:定义是否为活动
fingerprint:是 libsqlinjection 生成的指纹,我们希望(暂时)禁用它,允许查询与指定的指纹匹配
目前获取指纹的唯一方法是通过错误日志,ProxySQL 会将打印指纹和失败的查询。例如:
2019-11-28 16:17:23 MySQL_Session.cpp:3323:handler(): [ERROR] SQLinjection detected with fingerprint of 'Eoknk' from client pinkys_dbu@192.168.56.104 . Query listed below:
SELECT * FROM users WHERE username='asdsad' AND password='e2a521bc01c1ca09e173bcf65bcc97e9'
如果觉得这是正常的查询,那么可以使用 mysqlfirewallwhitelist_rules 将其加入白名单
INSERT INTO mysql_firewall_whitelist_sqli_fingerprints VALUES (1, \'Eoknk\');
mysqlfirewallwhitelistsqlifingerprints 是防火墙的一部分,因此,使用跟防火墙白名单一样的命令,将其载入到当前运行时:
LOAD MYSQL FIREWALL TO RUNTIME
mysqlfirewallwhitelistsqlifingerprints 对应运行时使用的表为
runtimemysqlfirewallwhitelistsqli_fingerprints 。