0


【CTF刷题2】ctfshow刷题web部分wp(1)

题目来源:ctfshow菜狗杯

web签到

考点:代码审计

image-20240725125048233

先传Cookie,即

CTFshow-QQ%E7%BE%A4:=a

(中文要进行url编码)

接下来传post[‘a’],即a=b

然后传get[‘b’],即?b=c

最后的request,传GET或者POST方法都可以,即

c[6][0][7][5][8][0][9][4][4]=system('cat /f*');

web2 c0me_t0_s1gn

考点:查看源代码,使用控制台

image-20240725133817711

image-20240725133847780

我的眼里只有¥

考点:代码审计,http请求

image-20240725192622896

_=a

,即

$__=a

,后面就是

$a

$a=b

,就变成$b,以此类推,用python脚本连续传参可解。

抽老婆

考点:查看源代码,代码审计,flask中的session构造

打开链接,发现可以下载“老婆“。查看代码,发现一串下载的可以代码。(/download?file=a)

image-20240725220105916

用GET方法下载一个文件,发现不成功,页面跳转。

image-20240725220228045

image-20240725220311186

发现”flag“,怀疑/app/app.py文件。下载此文件。

image-20240725220413846

报错,仔细分析,发现可以用…/退级,改为 …/…/app.py,成功下载。以下为文件内代码:

# !/usr/bin/env python
# -*-coding:utf-8 -*-

"""
# File       : app.py
# Time       :2022/11/07 09:16
# Author     :g4_simon
# version    :python 3.9.7
# Description:抽老婆,哇偶~
"""

from flask import * # type: ignore
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)

分析发现,它会根据不同/而调用不同的函数,我们需要使用getflag()函数,输入/secret_path_U_never_know。

image-20240725220748150

不行,还要使session[‘isadmin’]为真。
用到工具flask_session_cookie_manager。工具下载网站:https://github.com/noraj/flask-session-cookie-manager
先将原session解码,再将isadmin改为True,再编码,替换原session,得到flag。

image-20240725221139596

image-20240725221627896

dmin改为True,再编码,替换原session,得到flag。

image-20240725221646423

知识点分享:flask中的session伪造

一、session的作用
由于http协议是一个无状态的协议,也就是说同一个用户第一次请求和第二次请求是完全没有关系的,但是现在的网站基本上有登录使用的功能,这就要
求必须实现有状态,而session机制实现的就是这个功能。用户第一次请求后,将产生的状态信息保存在session中,这时可以把session当做一个容器,它
保存了正在使用的所有用户的状态信息;这段状态信息分配了一个唯一的标识符用来标识用户的身份,将其保存在响应对象的cookie中;当第二次请求时,
解析cookie中的标识符,拿到标识符后去session找到对应的用户的信息

二、flask session的储存方式
第一种方式:直接存在客户端的cookies中

第二种方式:存储在服务端,如:redis,memcached,mysql,file,mongodb等等,存在flask-session第三方库

flask的session可以保存在客户端的cookie中,那么就会产生一定的安全问题。

三、flask的session格式
flask的session格式一般是由base64加密的Session数据(经过了json、zlib压缩处理的字符串) . 时间戳 .
签名组成的。
eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Y48ncA.H99Th2w4FzzphEX8qAeiSPuUF_0
时间戳:用来告诉服务端数据最后一次更新的时间,超过31天的会话,将会过期,变为无效会话;

签名:是利用Hmac算法,将session数据和时间戳加上secret_key加密而成的,用来保证数据没有被修改。

四、flask session伪造
上面我们说到flask
session是利用hmac算法将session数据,时间戳加上secert_key成的,那么我们要进行session伪造就要先得到secret_key,当我们
得到secret_key我们就可以很轻松的进行session伪造。


本文转载自: https://blog.csdn.net/star3119391396/article/details/141271668
版权归原作者 梦 & 醒 所有, 如有侵权,请联系我们删除。

“【CTF刷题2】ctfshow刷题web部分wp(1)”的评论:

还没有评论