filterKeyword 绕过SQL注入需要授权 / 仅限授权测试
本仓库仅供安全研究和已获明确授权的测试使用。请勿对未授权系统使用。
本仓库仅用于安全研究与已获明确授权的测试。请勿对未授权系统使用。
RuoYi v4.8.3 代码生成模块的 /tool/gen/createTable 接口允许后台用户提交建表 SQL。接口调用 SqlUtil.filterKeyword() 进行关键字黑名单过滤,但实现中先删除输入里的全部空白字符,再匹配包含尾随空格的关键字(例如 select 、insert 、drop ),导致相关规则无法命中。
通过 CREATE TABLE ... AS SELECT ...(CTAS)语句,可在通过 Druid MySqlCreateTableStatement 类型检查的同时执行 SELECT。具有有效后台会话的攻击者可据此构造布尔盲注,读取数据库中的敏感信息并创建数据表。
JSESSIONID。验证脚本使用以下逻辑提取 sys_user 表中 admin 用户的密码哈希和 salt:
login_name、password 和 salt 字段。WHERE 中加入 SUBSTRING() 条件。/tool/gen/list 查询到。requests、urllib3安装依赖:
python -m pip install requests urllib3
打开 exp.py,修改顶部配置区中的以下两行:
TARGET = "http://127.0.0.1:8080"
COOKIE = "JSESSIONID=your_session_id"
其中:
TARGET:替换为待测试的 RuoYi URL,例如 http://127.0.0.1:8080。COOKIE:替换为登录后台后获得的有效 JSESSIONID session。修改完成后直接运行:
python exp.py
脚本会在目标数据库中创建中间表和大量布尔判断测试表。请仅在隔离或授权环境中使用,并在测试完成后由数据库管理员清理相关表。
exp.png 为本地授权环境中的成功验证截图:

filterKeyword() 的规范化与匹配逻辑,但不要将其作为唯一防护。RuoYi v4.8.3 代码生成模块中的 /tool/gen/createTable 端点接受来自已验证后台用户的建表 SQL。该端点调用 SqlUtil.filterKeyword() 来阻止危险的 SQL 关键字。然而,其实现会在检查包含尾随空格的黑名单条目(例如 select 、insert 、drop )之前移除输入中的所有空白字符,导致这些条目无法匹配规范化后的输入。
通过 CREATE TABLE ... AS SELECT ...(CTAS)语句,可以在通过 Druid MySqlCreateTableStatement 类型检查的同时执行 SELECT。拥有有效后台会话的攻击者可以利用此行为进行基于布尔的盲 SQL 注入、敏感数据提取和表创建。
JSESSIONID。该脚本通过以下 oracle 从 sys_user 中恢复 admin 的密码哈希和 salt:
login_name、password 和 salt 的中间表。SUBSTRING() 条件。/tool/gen/list 看到。requests、urllib3安装依赖:
python -m pip install requests urllib3
打开 exp.py,替换文件顶部配置区中的以下两行:
TARGET = "http://127.0.0.1:8080"
COOKIE = "JSESSIONID=your_session_id"
其中:
TARGET 是要测试的 RuoYi 基础 URL,例如 http://127.0.0.1:8080。COOKIE 是有效的已验证后台 JSESSIONID 会话。替换 URL 和会话后,运行:
python exp.py
该脚本会在目标数据库中创建一个中间表和许多布尔测试表。请仅在隔离或明确授权的环境中使用,并在测试后请数据库管理员移除生成的表。
exp.png 显示了本地授权环境中的成功验证:

filterKeyword() 中的规范化与匹配逻辑,但不要将其作为唯一的安全控制手段。exp.py - 验证脚本exp.png - 成功验证截图README.md - 中英双语漏洞说明