打开靶场发现是一个sql注入题,尝试注入1、0、1'、1' #看输入什么内容有正确的回显,最后发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显
尝试将1和or一起输入,构造万能密码,即1 or 1=1
应该是过滤了一些东西,这时我们就需要检查哪些关键字被过滤掉了,来判断此时应该使用什么注入方式
通过测试大概有以下关键字被过滤了:
|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|
报错注入,union联合注入,盲注皆不可行,发现;没有被过滤,所以我们尝试进行堆叠注入
爆库:
1; show databases;
爆表:
1;show tables;
看到表Flag,我们基本可以确定,flag在表Flag中。我们首先想到利用from来查询Flag,可是from关键字被过滤掉了,得像其他方法:
根据前面的回显:输入1到9返回Array ( [0] => 1(此处的1可能代表Ture)),输入0或字符没有回显,仅有的两种回显,可以判断出,后端应该使用的是逻辑或,即条件为真进行回显或条件不满足返回空白
补充:|| 或or 运算符讲解:
select command1 || command2
情况一:若command1为非0数字,则结果为1。
情况二:若command1为0或字母,command2为非0数字,则结果为1。
情况三:command1和command2都不为非0数字,则结果为0
通过以上分析,我们可以判断后端代码中存在或运算符,同时题目中还有这样的一句提示的话,需要你将flag交给它,它告诉你flag是不是真的,也就是说名后端的内容很有可能是||拼接:1、从网页获取的内容。2、真正的flag的内容
根据判断后端代码可能是这样:
$sql="select post['query'] || flag from Flag";
若输入*,1。那么sql语句就变成了 select *, 1 || flag from Flag,1||flag是个短路算法,直接输出1了,select * from Flag 通过查看表Flag中的所有数据可以 get到flag
爆字段:
*,1