信息搜集
进入界面是一个搜索框:
查看一下源代码,显示是POST传参:
随便上传个数字1:
抓包测试一下闭合,发现以双引号闭合会回显nonono,单引号闭合则无回显。
由于没有报错信息,所以我们不能确定具体的闭合形式。
测试一下有没有哪些关键字被过滤,找找灵感:
过滤了联合注入和报错注入的命令。
但是分号;
没有被过滤,我们可以尝试堆叠注入
SQL注入
1;show databases;
1;show tables;
接下来想用show columns from Flag;
爆出字段名,但是from和flag都被过滤了,无果。
到这里被卡住了,看了别人的WP,发现后端查询语句是这样的:
$sql = "select ".$post['query']."||flag from Flag";
补充:|| 或or 运算符讲解:
select command1 || command2
情况一:若command1为非0数字,则结果为1。
情况二:若command1为0或字母,command2为非0数字,则结果为1。
情况三:command1和command2都不为非0数字,则结果为0。
所以我们使用 sql_mode 中的 PIPES_AS_CONCAT 函数
该函数的作用是将:或运算符 转换为 连接字符,即将||前后拼接到一起。
1;sql_mode=PIPES_AS_CONCAT;select 1
拼接后的语句变成:
$sql = "select 1;sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag";
select 1||flag from Flag
表示先查询1的结果,再查询flag的结果,最后将结果合并输出。
但是这道题select被ban了,这种方法不能用,就当积累了。
输入 *,1
$sql = "select *,1||flag from Flag";
相当于
select * flag from Flag;select 1||flag from Flag;
搜索了表中所有数据,得到flag。