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

梦 & 醒 2024-08-30 10:33:01 阅读 95

题目来源:ctfshow菜狗杯

web签到

考点:代码审计

image-20240725125048233

先传Cookie,即<code>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

<code>_=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,成功下载。以下为文件内代码:

<code># !/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)code>

分析发现,它会根据不同/而调用不同的函数,我们需要使用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伪造。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。