2022虎符
babysql
比赛的时候一开始没发现过滤了空格,所以一直出不了,后来才发现,所以说,对于不确定的正则表达式还是要去实际测试一下才行,然后一看就是要盲注,由于过滤了括号
.replace(/[\s,()#;*\-]/g, '') |
所以首选肯定是case,接下来就是构造盲注语句了,由于是要用regexp来构造,读一下文档,发现regexp可以直接作为等号来使用,并且无需空格,可直接比对内容,一开始构造的是,问题在于直接这样是会爆出语法错误的,这个时候’1’和case直接需要有东西隔开,当时思维禁锢住了,没想到使用||。。。。傻逼了
or'1'='1'case'1'whenxxxx |
构造出来以后可以得到
'a'||case'1'when'1'then'1'else'0'end||'a'; |
,接下来就是使用regexp进行盲注,盲注的结果分为两种,一种是状态401,一种是状态500,500是因为报错才会产生的,所以我们就构造一个报错盲注,由于不能使用函数,所以这里可以通过数值之间的大数运算来引起报错
'a'||case'1'when'1'then'1'else~0+~0+'a'end||'a'; |
接下来就是完善最重要的regexp的盲注部分了
'||case'1'when`username`regexp'^Db'then'1'else~0+~0+'a'end||'a' limit 1; |
但是接下来还需要解决大小写问题,查阅mysql8.0的文档,发现regexp在比对的时候可以设置字符集用来表示规则(也就是可以比对大小写)但是我在本地测试的时候,发现要使用对应数据库的编码形式才可以,看了一下hint,可以发现这个数据库是使用这个编码规则的
COLLATE=utf8mb4_0900_as_cs |
所以我们的payload也呼之欲出了,使用
'||case'1'when`username`regexp'a'COLLATE‘utf8mb4_0900_as_cs’then'1'else~0+~0+'a'end||'a |
接下来就是写成脚本了
import requests |