首页 > 其他分享 >[GHCTF 2024 新生赛]理想国 flask session伪造

[GHCTF 2024 新生赛]理想国 flask session伪造

时间:2024-06-07 14:12:25浏览次数:7  
标签:username return flask app 2024 token session password def

忙着毕业论文几天没做题了。
进入页面发现几个api接口,注册登录搜索登出4个。

利用postman访问注册接口注册。

可以看到返回了token,利用token访问login。

尝试search页面传入file参数试试能不能目录穿越。

得到secret-key,这里有个非预期解,访问/proc/1/environ直接得到flag。

预期解:访问/app/app.py得到源码。

点击查看代码
# coding=gbk
import json
from flask import Flask, request, jsonify, send_file, render_template_string
import jwt
import requests
from functools import wraps
from datetime import datetime
import os

app = Flask(__name__)
app.config['TEMPLATES_RELOAD'] = True
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

response0 = {'code': 0, 'message': 'failed', 'result': None}
response1 = {'code': 1, 'message': 'success', 'result': current_time}
response2 = {'code': 2, 'message': 'Invalid request parameters', 'result': None}

def auth(func):
    @wraps(func)
    def decorated(*args, **kwargs):
        token = request.cookies.get('token')
        if not token:
            return 'Invalid token', 401
        try:
            payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
            if payload['username'] == User.username and payload['password'] == User.password:
                return func(*args, **kwargs)
            else:
                return 'Invalid token', 401
        except:
            return 'Something error?', 500
    return decorated

def check(func):
    @wraps(func)
    def decorated(*args, **kwargs):
        token = request.cookies.get('token')
        if not token:
            return 'Invalid token', 401
        try:
            payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
            if payload['username'] == "Plato" and payload['password'] == "ideal_state":
                return func(*args, **kwargs)
            else:
                return 'You are not a sage. You cannot enter the ideal state.', 401
        except:
            return 'Something error?', 500
    return decorated

@app.route('/', methods=['GET'])
def index():
    return send_file('api-docs.json', mimetype='application/json;charset=utf-8')

@app.route('/enterIdealState', methods=['GET'])
@check
def getflag():
    flag = os.popen("/readflag").read()
    return flag

@app.route('/api-base/v0/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.json['username']
        if username == "Plato":
            return 'Your wisdom is not sufficient to be called a sage.', 401
        password = request.json['password']
        User.setUser(username, password)
        token = jwt.encode({'username': username, 'password': password}, app.config['SECRET_KEY'], algorithm='HS256')
        User.setToken(token)
        return jsonify(response1)
    return jsonify(response2), 400

@app.route('/api-base/v0/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.json['username']
        password = request.json['password']
        try:
            token = User.token
            payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
            if payload['username'] == username and payload['password'] == password:
                response = jsonify(response1)
                response.set_cookie('token', token)
                return response
            else:
                return jsonify(response0), 401
        except jwt.ExpiredSignatureError:
            return 'Invalid token', 401
        except jwt.InvalidTokenError:
            return 'Invalid token', 401
    return jsonify(response2), 400

@app.route('/api-base/v0/logout')
def logout():
    response = jsonify({'message': 'Logout successful!'})
    response.delete_cookie('token')
    return response

@app.route('/api-base/v0/search', methods=['POST', 'GET'])
@auth
def api():
    if request.args.get('file'):
        try:
            with open(request.args.get('file'), 'r') as file:
                data = file.read()
            return render_template_string(data)

        except FileNotFoundError:
            return 'File not found', 404
        except jwt.ExpiredSignatureError:
            return 'Invalid token', 401
        except jwt.InvalidTokenError:
            return 'Invalid token', 401
        except Exception:
            return 'something error?', 500
    else:
        return jsonify(response2)

class MemUser:
    def setUser(self, username, password):
        self.username = username
        self.password = password

    def setToken(self, token):
        self.token = token

    def __init__(self):
        self.username = "admin"
        self.password = "password"
        self.token = jwt.encode({'username': self.username, 'password': self.password}, app.config['SECRET_KEY'], algorithm='HS256')

if __name__ == '__main__':
    User = MemUser()
    app.run(host='0.0.0.0', port=8080)
所以实质就是伪造session,用户名为Plato,密码为ideal_state,secret-key已经知道了,直接在jwt.io进行下一步,利用伪造的session访问enterIdealState页面得到flag。

标签:username,return,flask,app,2024,token,session,password,def
From: https://www.cnblogs.com/jocker-love-you/p/18237102

相关文章

  • 【2024-06-06】认清上进
    20:00我们都太专注于自己的伤口,忘了要去握住别人伸出的手。                                                 ——宫崎骏35岁之前,我们可以为了生活而牺牲一点生活时间......
  • 好久没来了-20240607
    【今天又是什么日子】今天是2024年6月7日,星期五,其实也没有很特别只不过刚好是今年高考的第一天,写这个的时候上午的考试应该完了高考很重要,每一天都很重要年轻很好,每一天也很好且行且珍惜【上次来是什么时候】上次来还是上个月月中的时候,准备跳槽来着【为啥突然记得来了】......
  • 2024 Web 新特性 - 使用 Popover API 创建弹窗
    PopoverAPI为开发者提供了一种声明式的方式来创建各种类型的弹窗。目前已在所有三大浏览器引擎中可用,并正式成为Baseline2024的一部分。一直以来,我们在实现弹出式菜单、提示框或信息卡片时,往往依赖于各种JavaScript库或者自定义CSS样式来完成。虽然这些方法有效,但它们通常伴......
  • 打卡信奥刷题(60)用Scratch图形化工具信奥P10424 [普及组] [蓝桥杯 2024 省 B] 好数,写
    [蓝桥杯2024省B]好数题目描述一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。给定一个正整数N......
  • 上海市青少年算法2024年5月月赛(丙组)
    上海市青少年算法2024年5月月赛(丙组)T1加法的进位题目描述给定两个整数a与b,请计算在十进制加法过程中,a+b产生了多少次进位。输入格式第一行:单个整数表示a。第二行:单个整数表示b。输出格式单个整数:表示发生进位的次数。数据范围1≤a,b≤1,000,000,000样例数据......
  • 中电金信:产教联合共育人才 AFAC2024金融智能创新大赛启动
    当前,人工智能技术正在蓬勃发展,引领着各行各业迈向智能化的新纪元,特别是在金融科技领域,伴随人工智能技术的不断迭代与突破,金融服务的边界也在不断拓展,传统的金融业态正经历着深刻的变革与重塑。 与此同时,随着金融科技持续创新与数字化转型深入推进,我国对于金融科技人才的需求日......
  • 尚硅谷2024最新Java入门视频教程(上部)java零基础入门教程(1)
    快捷键硬件和软件的概念字节的概念dos命令jvm和跨平台jdk和jre jdk下载1.官网www.oracle.com配置环境变量java第一个程序的开发这里我发现虽然配置了系统环境变量,但是并不能在任何地方运行,我自己的理解是可能系统区分不了到底要运行......
  • 华夏泰科:2024年江苏首批省星级上云企业申报指南
    为贯彻落实《江苏省制造业智能化改造和数字化转型三年行动计划(2022—2024年)》(苏政办发〔2021〕109号),加快推进企业“上云上平台”,围绕“1650”产业体系建设,助力制造业“智改数转网联”,支撑数实融合强省建设,现组织开展2024年度首批省星级上云企业创建工作。华夏泰科为您带来......
  • 科研日记4【2024-06-06】
    实验高度向稀疏采样造成的整行缺失使得在高度向上出现严重混叠现象,对高度向稀疏采样的数据首先利用线性插值恢复补全,再将部分插值去掉,以模拟二维随机降采样。实验结果说明上述方法并不好。高度向50%稀疏直接成像:高度向50%稀疏-不动迭代成像:高度向50%稀疏-线性插值后成像......
  • 活动预热丨在 AGI Playground 2024 遇见一群 RTE+AI 的 Builders
    6月22、23日,北京。 AGIPlayground2024,这个夏日最火热的AGI盛会。 王小川、杨植麟等AGI创业者悉数参加。 RTE开发者社区的builders和RTEOpenDay也将在现场! 我们将为大家呈现两大板块:01实时开发挑战WorkshopRTE开发者社区将联合「零一万物」发起w......