巅峰极客2023 hellosql

随便输一个payload,有waf

巅峰极客2023 hellosql_第1张图片

这题只有两个回显,分别是太酷啦nonono,不显示报错、登录成功等各种信息,目前只能想到用时间盲注。

抓包fuzz,194都是被过滤的

巅峰极客2023 hellosql_第2张图片

不止这些,手工测出来if、sleep、benchmark、*、rpad、count也被过滤了。

测试注释符:

?id=if                              显示nonono,说明滤了
?id=1'''''''''''''''#if             显示太酷啦,说明不滤,所以注释符是#

说明注释符#可以用。

查看各种信息,发现是php。

巅峰极客2023 hellosql_第3张图片

考虑到可能是长连接,可以使用get_lock作为延时手段,并且这个没有被过滤。

经过验证,无法使用get_lock作为延时手段。

巅峰极客2023 hellosql_第4张图片

认定了是时间盲注,那就换一种延时方式。

过滤了*,无法使用现成的笛卡尔积payload,那就手搓。

过滤if那就用case when condition then 1 else 0 end语句代替

巅峰极客2023 hellosql_第5张图片

得到flag。

巅峰极客2023 hellosql_第6张图片

还有一种绕过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,师傅牛逼!

你可能感兴趣的:(CTF赛事,web安全)