
输入个万能密码进去测试:

点击"点我验证成绩"。

猜测是要总分>425,所以可以修改听力的成绩。
用fuzz测试有没有过滤:

可以看到union select联合注入,updatexml报错注入,改分要的 update等等都被拦截,那就用堆叠注入。
sql
1';show tables;-- -

sql
1';desc score;-- -
发现听力的字段名为listen。

WAF 的工作方式是:拿到你输入的原始字符串,用正则去匹配里面有没有连续的 update 这个词。它不会真正理解 SQL 语义。
那我们就让输入里不出现连续的 update ,但让数据库在运行时把它拼出来。靠的是 MySQL 的预处理三件套:
SET @q=...:定义一个用户变量,存放 "真正想执行的 SQL 字符串";PREPARE s FROM @q:把这个字符串编译成一条预处理语句;EXECUTE s:执行它。
关键就在 CONCAT('UP','DATE ...')------ 输入文本里写的是被拆开的 'UP' 和 'DATE',WAF 扫描时怎么都匹配不到完整的 update ;而 MySQL 执行 CONCAT 后又把它们拼成了完整的 UPDATE score SET listen=300,照常执行。
paylaod如下:
sql
1';set @q=concat("up","date score set listen=300");prepare s from @q;execute s;-- -

再查询发现听力成绩被改成300了:

点击"点我验证成绩",flag出来了
