随便输一个payload,有waf
这题只有两个回显,分别是太酷啦
和nonono
,不显示报错、登录成功等各种信息,目前只能想到用时间盲注。
抓包fuzz,194都是被过滤的
不止这些,手工测出来if、sleep、benchmark、*、rpad、count也被过滤了。
测试注释符:
?id=if 显示nonono,说明滤了
?id=1'''''''''''''''#if 显示太酷啦,说明不滤,所以注释符是#
说明注释符#
可以用。
查看各种信息,发现是php。
考虑到可能
是长连接,可以使用get_lock
作为延时手段,并且这个没有被过滤。
经过验证,无法使用get_lock
作为延时手段。
认定了是时间盲注,那就换一种延时方式。
过滤了*
,无法使用现成的笛卡尔积payload,那就手搓。
过滤if
那就用case when condition then 1 else 0 end
语句代替
得到flag。
还有一种绕过if过滤的办法
1' and 判断字符语句 and 笛卡尔积延时#"
这个的原理是and短路。因为and需要两边都为true,才能为true。比如说 条件1 and 条件2
,如果条件1为true才会去判断条件2,但是如果条件1为false,就不会再去判断条件2了,and直接返回false。
网上找的另外一个大佬(Boogipop)的盲注语句:
时间盲注,用笛卡尔积/index.php?id=1'or+elt(1>2,(SELECT+group_concat('1')+FROM+information_schema.columns+A,+information_schema.columns+B))+or'2/index.php?id=1'or+elt(3>2,(SELECT+group_concat('1')+FROM+information_schema.columns+A,+information_schema.columns+B))+or'2
看了一下,延时也是用了笛卡尔积。但是if用elt代替了。
这个elt
函数非常的陌生,网上的解释:
ELT()函数是分值函数,功能有点类似很多编程语言中的switch关键字。
语法:
ELT(N,str1,str2,str3,…)其中N是要判断的数值,如果N=1,则返回str1,如果N=2,则返回str2,以此类推。
另外对不上的值返回Null,比如N=0,或者N大于后面列表的长度。
(1条消息) Mysql的分段函数INTERVAL()和分值函数ELT()_sql分值函数_lkforce的博客-CSDN博客
由此看来,elt确实能够代替if,师傅牛逼!