0x01 前言
该篇文章起源于XCTF 决赛中清华对一道web题的非预期,在该题中过滤了很多的关键字,包括SELECT
等,预期解为mariadb主从复制,但清华使用EXECUTE IMMEDIATE
绕过了黑名单导致非预期,这里详细来分析一下该种绕过方法。
0x01 基础用法
EXECUTE IMMEDIATE Statement (oracle.com)
在 MariaDB 10.0.3 之后,新增了一个名为 EXECUTE IMMEDIATE
的 SQL 语句,它可以将字符串作为动态 SQL 查询语句执行。这个语句的语法如下:
EXECUTE IMMEDIATE stmt_string [INTO var_name [, ...]]
其中,stmt_string
是要执行的 SQL 查询字符串,可以包含占位符。var_name
是可选的参数列表,用于从查询结果中接收值。
例如,下面的代码展示了如何使用 EXECUTE IMMEDIATE
执行一个简单的 SELECT 查询:
SET @id = 123;
SET @stmt = CONCAT('SELECT * FROM mytable WHERE id = ', @id);
EXECUTE IMMEDIATE @stmt;
在这个例子中,我们将 @id
变量的值拼接到 SQL 查询字符串中,然后使用 EXECUTE IMMEDIATE
关键字执行该查询,并输出结果。
0x02 绕过分析
具体解题思路参考 ((20230329135113-j13bte1 'The 7th XCTF Finals WEB WP')) 这篇文章,该题中手工测试出的黑名单如下:
black list
select
set
GRANTS
create
insert
load
PREPARE
rename
update
HANDLER
updatexml
其中过滤了常用的几大关键字,通过EXECUTE IMMEDIATE
可以进行绕过
原题中使用的环境为mariadb 10.3.38
EXECUTE IMMEDIATE 'SELECT * FROM ctf.admin';
可以直接执行字符串中的sql语句,在基于这一点的情况下就很容易进行绕过
该题中并没有过滤各种字符串编码,所以我们可以使用如下方法进行绕过
EXECUTE IMMEDIATE UNHEX('53454c454354202a2046524f4d206374662e61646d696e');
将SELECT * FROM ctf.admin
转为hex再使用UNHEX方法转换为字符串进行执行
同理,这里也可以使用BASE64之类的进行绕过
0x03 总结
又跟着清华哥学到一个trick。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1ivtybyukjjvb
您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。