题目环境:http://8.129.4.24:20003/

打开题目进入登录界面,没有账号,随便注册一个并登录

但是验证需要使用与给定前6位的md5值相同的验证码,这里给出一个脚本

1
2
3
4
5
6
7
8
9
10
11
import hashlib

def func(md5_val):
for x in range(999999, 100000000):
md5_value=hashlib.md5(str(x).encode(encoding='utf-8')).hexdigest()
if md5_value[:len(md5_val)]==md5_val:
return str(x)

if __name__ == '__main__':
MD5=input('请输入md5值的任意前几位:')
print(func(MD5))

注册并且登录后,出现一个secret,点击发现提示只有admin才可以看到,想到应该要提权,burp抓个包看看

分析服务器应该是根据cookie中的usr值来判断用户身份,多登录几次,观察usr有没有什么特殊之处

经过观察发现usr的奇数位总是不变,并且奇数位的数量正好等于用户名的位数,例如用户名为toms,usr的奇数位总是为vmkq;用户名为tom,usr的奇数位总是为vmk,推测usr是按照某种规律对用户名进行编码,每个字母是一一对应的,如果找到admin编码后的字符放到user中,应该就可以骗过服务器了,此时可以注册一个用户名为abcdefghijklmnopqrstuvwxyz的用户,查看该用户的usr字段值,可以得到每个字母编码后的对应值,这样就可以构造出admin的usr了

得到usr为_<dla+fDc~hFeQjug&l5ihnmknp(m/rToKt#qav>s#xouAzwwB|{
把usr的奇数位提取出来得到_dafchejglinkpmrotqvsxuzw|,给出提取奇数位的脚本

1
2
3
4
5
6
a='_<dla+fDc~hFeQjug&l5ihnmknp(m/rToKt#qav>s#xouAzwwB|{'
res=""
for i in range(0,len(a)):
if(i%2==0):
res+=a[i]
print(len(res))

现在得到了一组对应关系:
abcdefghijklmnopqrstuvwxyz
_dafchejglinkpmrotqvsxuzw|
现在只需要根据这组对应关系找出admin的编码即可,可以一个一个看,也可以用下面的脚本

1
2
3
4
5
6
7
8
9
a='_dafchejglinkpmrotqvsxuzw|'
b='abcdefghijklmnopqrstuvwxyz'
username='admin'
usr=""
for i in username:
for n in range(0,len(b)):
if(b[n]==i):
usr+=a[n]
print(usr)

得到admin的usr为_fkgp,于是访问secret时,将usr的奇数位改为_fkgp,偶数位随意,发送,得到flag