nullcon HackIM CTF补题

之前一直有各种事情没来得及补题,这周日终于闲了下来可以有时间补补题,这次的比赛虽然web就两道题但是很值得补一下的。而本菜鸟也只做出了最简单的第一题。害。现在正是Wolv ctf比赛的时候,看了看web题,嗯,好难。本菜鸟深知实力不够,干脆就趁这个时间把之前的题都补一补。

一.cookie伪造

这题应该是非常简单的一道题,下载源码后可以在代码中找到如下语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@app.route('/whoami')
def whoami():
role = request.cookies.get('role','guest')
really = request.cookies.get('really', 'no')
if role == 'admin':
if really == 'yes':
resp = 'Admin: ' + os.environ['FLAG']
else:
resp = 'Guest: Nope'
else:
resp = 'Guest: Nope'
return Response(resp, mimetype='text/plain')

if __name__ == "__main__":
app.run(host='0.0.0.0', port='8080', debug=False)

可以很清晰的看到上面两个if语句都通过后就可以打印出flag,因此借助burp语句可以很快速的实现。如下图

先是用burp抓包,然后构造一下cookie使其可以通过if,点击action将其发送到repeater,然后点击send便可以发送我们构造好了的cookie,之后便可以接收到flag了!如下

二、上传文件

这题的题解主要参照这个网址

但是很奇怪,我参照这个网址的方法下来出现了没有找到文件的标志

于是我又去找了另一个官方的题解网址,根据他的做法下来,也是一样的标志,这样只能说明flag文件已经被官方删除了??具体原因我也不太清楚。但是方法肯定是这样的,如下

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
@app.route('/', methods=['GET'])
def index():
output = io.StringIO()
output.write("Send me your zipfile as a POST request and I'll make them accessible to you ;-0.")

return Response(output.getvalue(), mimetype='text/plain')


@app.route('/', methods=['POST'])
def upload():
output = io.StringIO()
if 'file' not in request.files:
output.write("No file provided!\n")
return Response(output.getvalue(), mimetype='text/plain')

try:
file = request.files['file']

filename = hashlib.md5(secrets.token_hex(8).encode()).hexdigest()
dirname = hashlib.md5(filename.encode()).hexdigest()

dpath = os.path.join("/tmp/data", dirname)
fpath = os.path.join(dpath, filename + ".zip")

os.mkdir(dpath)
file.save(fpath)


with zipfile.ZipFile(fpath) as zipf:
files = zipf.infolist()
if len(files) > 5:
raise Exception("Too many files!")

total_size = 0
for the_file in files:
if the_file.file_size > 50:
raise Exception("File too big.")

total_size += the_file.file_size

if total_size > 250:
raise Exception("Files too big in total")

check_output(['unzip', '-q', fpath, '-d', dpath])


g = glob.glob(dpath + "/*")
for f in g:
output.write("Found a file: " + f + "\n")

output.write("Find your files at http://...:8088/" + dirname + "/\n")


except Exception as e:
output.write("Error :-/\n")

return Response(output.getvalue(), mimetype='text/plain')



if __name__ == "__main__":
app.run(host='0.0.0.0', port='8080', debug=True)

先看代码,看见是让我们上传一个zip文件,当时就卡在了上传文件好像没什么用这里了,看了题解是要用软链接,不能直接上传,如下图:

先输入ln -s 将文件变为软链接格式,然后打包压缩,最后按照下面的代码上传文件

1
2
3
4
5
6
import requests
url = "http://52.59.124.14:10015/"
files = {'file':open('test.zip','rb')}
res = requests.post(url,files=files)

print(res.text)

最后回复如下

然后在10016端口打开这个网址就会出现下面的网页

正常来说应该是点击这个flag@就会出现flag,但是并没有出现,但是方法肯定就是这样的了。

接下来就是有时间补补lactf的题,感觉那个题都还不错,值得补一下,剩下的就是等这个ctf结束看题解了。。。