前言
考察php的语言特性和md5
Part 1
打开题目后界面上只有一句话
查看源代码后发现注释部分有提示,要以Get方式传入两个参数,
要求$a != $b && md5($a) == md5($b)
,直接传入数组进行绕过
Part 2
进入下一个界面后要求输入一个串值,取其md5值,再进行substr(5,5)
后等于题目给定的随机字符串,图中为bee38
,这种md5截取比较的题目需要自己写脚本爆破
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import multiprocessing import hashlib import random import string import sys CHARS = string.ascii_letters + string.digits def cmp_md5(substr, stop_event, str_len, start=0, size=20): global CHARS while not stop_event.is_set(): rnds = ''.join(random.choice(CHARS) for _ in range(size)) md5 = hashlib.md5(rnds.encode('utf-8')) if md5.hexdigest()[start: start+str_len] == substr: print (rnds) stop_event.set() if __name__ == '__main__': substr = sys.argv[1].strip() start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0 str_len = len(substr) cpus = multiprocessing.cpu_count() stop_event = multiprocessing.Event() processes = [multiprocessing.Process(target=cmp_md5, args=(substr, stop_event, str_len, start_pos)) for i in range(cpus)] for p in processes: p.start() for p in processes: p.join()
|
这个是从网上套用的python脚本,但爆破出的字符串居然输入进去无法符合要求,这让我十分费解,截取的5位字符也和题目要求的一样,我十分疑惑。最后发现只有将代码中的CHARS设置成数字,爆破的串长度设为5的时候才能通过,这里的问题留待解决。
将答案输入后成功进入下一关
Part 3
来到下一关,界面中只有一个输入框和一个提交按钮,应该要进行注入
查看源代码后获得提示,这里是跟BJDCTF的某道题目一模一样的,可以用ffifdyop
绕过,详细可以参考[BJDCTF 2020] Easy MD5
非预期解:观察这两关的地址,一个是md51.php,一个是md52.php,于是这里想到直接跳转到md53.php
Part 4
又是md5比较,直接数组绕过
得到flag