题目来源:ctfshow菜狗杯
web签到
考点:代码审计
先传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
考点:查看源代码,使用控制台
我的眼里只有¥
考点:代码审计,http请求
_=a
,即$__=a
,后面就是$a
,$a=b
,就变成$b,以此类推,用python脚本连续传参可解。
抽老婆
考点:查看源代码,代码审计,flask中的session构造
打开链接,发现可以下载“老婆“。查看代码,发现一串下载的可以代码。(/download?file=a)
用GET方法下载一个文件,发现不成功,页面跳转。
发现”flag“,怀疑/app/app.py文件。下载此文件。
报错,仔细分析,发现可以用…/退级,改为 …/…/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。
不行,还要使session[‘isadmin’]为真。
用到工具flask_session_cookie_manager。工具下载网站:https://github.com/noraj/flask-session-cookie-manager
先将原session解码,再将isadmin改为True,再编码,替换原session,得到flag。
dmin改为True,再编码,替换原session,得到flag。
知识点分享: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伪造。