之前一直有各种事情没来得及补题,这周日终于闲了下来可以有时间补补题,这次的比赛虽然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 requestsurl = "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结束看题解了。。。