ProxySQL SQL 注入引擎

ProxySQL 2.0.9 引入了 libsqlinjection 作为识别可能的 SQL 注入攻击的机制。

启用 S​​QL 注入检测

要启用 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 。
posted @ 2022-06-20 17:49  哈喽哈喽111111  阅读(140)  评论(0编辑  收藏  举报