Mariadb EXECUTE IMMEDIATE 解析

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

评论

  1. rantrism
    Windows Chrome
    8月前
    2023-4-23 10:28:25

    您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇