能否不指定表名及特定关键字查询MySQL users表?
日志过滤规则的绕过风险及应对
确实存在绕过你的过滤规则的可能
攻击者可以通过多种方式在不直接使用"users"表名及指定关键字的前提下查询users表数据,导致日志遗漏,常见方法包括:
使用表的内部数字ID:
MySQL允许通过表的内部标识符(table_id)代替表名。攻击者先通过查询获取users表的ID:SELECT table_id FROM information_schema.tables WHERE table_name = 'users';之后直接用ID查询:
SELECT * FROM 1234; -- 1234为users表的table_id这条语句不含"users"及你指定的关键字,会被过滤规则遗漏。
利用预定义视图:
若攻击者提前创建了指向users表的视图:CREATE VIEW u AS SELECT * FROM users;后续仅需调用视图即可查询数据:
SELECT * FROM u;该语句无"users"关键字,会被过滤掉。
调用存储过程/函数:
攻击者预先创建包含users表查询逻辑的存储过程:DELIMITER // CREATE PROCEDURE get_users() BEGIN SELECT * FROM users; END // DELIMITER ;调用时仅需执行:
CALL get_users();调用语句不含目标表名及指定关键字,会被过滤遗漏。
应对建议
改用Google Cloud SQL原生审计日志:
放弃基于general_log的字符串过滤,启用Cloud SQL的审计日志功能,它能精准记录所有对users表的访问操作,无论攻击者采用何种访问方式。强化过滤规则:
若必须使用general_log,需扩展匹配逻辑:- 监控所有查询
information_schema.tables的操作,尤其是获取users表信息的请求 - 匹配所有涉及表ID的查询语句
- 监控视图、存储过程的创建及调用操作
- 监控所有查询
限制localhost用户权限:
缩小localhost用户的权限范围,禁止其创建视图、存储过程,或查询information_schema获取表结构信息,从根源降低攻击者的绕过能力。
内容的提问来源于stack exchange,提问作者jwtrees
相关产品推荐
相关产品推荐

