前言

考察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