本题考查SQL注入
在输入框中随便输入数字(如 1)提交,页面返回正常。
尝试输入分号 ; 测试是否存在堆叠注入

发现页面没有报错,且可以正常执行,说明后端支持多语句执行(堆叠注入)。接着查看数据库中的表:

发现存在列名为flag,尝试读取这个列
1;show columns from Flag

说明存在过滤
这道题的后端源码逻辑大致类似于
php
$sql = "select " . $_POST['query'] . " from Flag;";
$result = mysqli_query($conn, $sql);
payload:
*,1

将输入代入后端的 SQL 语句中,整条语句会变成:
select *,1 from Flag;
因为* 在 SQL 中代表查询表中的所有列。
,1 表示在所有列后面额外拼接一个常量列 1。
因为后端本身已经自带了 from Flag,你通过输入 *,1 直接闭合或补全了 select 子句,强制让数据库把 Flag 表里的所有列(包括藏有 Flag 的那一列)全部原封不动地查询并展示出来,从而绕过了对 select 或列名的过滤限制
解法二:堆叠注入修改 sql_mode
通过堆叠注入修改 MySQL 的 sql_mode,将 || 运算符由"逻辑或"变为"字符串连接符"
原语句变为:SELECT CONCAT(输入, flag) FROM Flag
payload:
1;set sql_mode=PIPES_AS_CONCAT;select 1
select 1触发查询 → 因||转为连接符,返回1与flag拼接的结果