Web 4 [LitCTF 2023]Flag点击就送!

piter 发布于 2024-11-29 376 次阅读 508 字


AI 摘要

在这个充满挑战的网络安全世界中,解锁秘密的关键常常隐藏在简单的地方。本文将带你深入LitCTF 2023的剖析,通过对Flask框架中session签名机制的探究,揭示如何巧妙伪造管理员身份,从而获取隐藏的flag。你是否准备好挑战自己的技术极限,一步步破解这场数字谜题呢?跟随我们的思路,为你解开Web 4的神秘面纱,一起来冒险吧!

LitCTF 2023]Flag点击就送! | NSSCTF

题目一开始提示管理员才能拿到flag

有输入框,想都没想直接填写admin

不出所料诶~~~

那就尝试一下别的随便用户名,诶有个拿flag的按钮,好吧,要管理员才可以

那就只能伪造了

和之前做过的邮箱重置链接的JWT不同,这里找到session

有点像base64,但我之前研究的一点经验,有点像签名

扔给赛博厨子看看

果然是签名

仔细查看网页框架

是flask框架,这次是session伪造了

查看flask资料和各位师傅的wp

flask框架的session是存储在客户端的,那么就需要解决session是否会被恶意纂改的问题,而flask通过一个secret_key,也就是密钥对数据进行签名来防止session被纂改。

from flask import Flask, request, render_template, session, redirect
from datetime import datetime
​
app = Flask(__name__)
​
app.config['SECRET_KEY'] = 'laowangaigebi'  # 设置session加密的密钥
​
@app.route('/login', methods=['GET', 'POST'])  # 支持get、post请求
def login():  # 登录视图函数    
    # 模拟登录成功后把uid和username存到session里
    session['uid'] = '123456'
    session['username'] = 'laowang'    
    return redirect('/')  # 登录成功后到首页
​
@app.route('/', methods=['GET', 'POST'])  # 支持get、post请求
def index():
    username = session.get('username')  # 取session
    if username:        
        return 'welcome %s' % username    
    else:        
        return '请登录'
​
app.config['DEBUG'] = True
if __name__ == '__main__':    
    # 0.0.0.0代表任何能代表这台机器的地址都可以访问    
    app.run(host='0.0.0.0', port=5000)  # 运行程序
#flask的加密语言
作者:小源
链接:https://juejin.cn/post/6844903833663963144
来源:稀土掘金

猜测key

由于题目没有给,我们只好猜测key为LitCTF





python flask_session_cookie_manager3.py encode -s 'LitCTF' -t '{"name":"admin"}'
eyJuYW1lIjoiYWRtaW4ifQ.ZUoYpw.-wWfai1NY-VXpGGXHqnCG5H9-Ug

使用kali虚拟机运行一下,将得到的session填入cookie-editor保存,刷新后即可拿到flag

NSSCTF{47877fbb-32b0-46ec-bdd6-a926b910870e}

  • wechat_img
永远不要因为需要大量时间才能完成,就放弃梦想,时间怎么样都会过去的
最后更新于 2024-11-29