当前位置: 首页 > news >正文

2026数字中国创新大赛个人赛-Web

写在前面

个人赛分三段,阶段性放题,只有一道web,但是挺有意思,记录一下,附件我放文末了

CloudPulse

附件就两个,前端是python,后端是go

image-20260412193403358

通信渠道是这个函数:

def forward_to_backend(payload: dict):try:resp = requests.post(BACKEND_URL,json=payload,headers={"Content-Type": "application/json"},timeout=10)return jsonify({"status": "success", "data": resp.text})except requests.RequestException as e:return jsonify({"status": "error", "message": "Backend service unavailable"}), 503

从env中拿到BACKEND_URL和后端通信

了解完大致的结构后,开始找sink点:

image-20260414194331838

找完了也只发现了这一个sink点,虽然限定了curl方法,但是也可以用来文件读取,这里想到的是file://读取flag

往回推,看看能不能实现:

image-20260414200345518

参数是可添加的,基本坐实了sink点,接着往回看:

target由此处传入,看看waf:

image-20260414200605306

validateTarget:

image-20260414200704009

要求以http://或https://开头,这里其实对我们file伪协议没什么影响,因为curl是可以接收多个url的,接着看:

MatchString:

image-20260414200930556

对target和customHeaders设了黑名单,这里过滤了file://,看似走不通了,其实不然,file:/flag也是可以的:

scheme:file 加绝对路径 /flag,curl 接受这种写法,而且它允许冒号后面出现 1 到 3 个斜杠

接着走,看看哪里调用了performFetch:

image-20260414201721276

这里的aa函数是啥呢,看看定义:

image-20260414201748713

分别对应ops、httpcheck、fetch,先看switch怎么写的:

image-20260414202023510

原来是对传入的Ops字段的值进行匹配,那这里我们就知道要使得req.Ops的值为fetch了,这个函数的其他部分对我们的payload暂时没什么作用,先不看,找找这个函数在哪里被调用:

image-20260414202422501

找到了main函数,go文件基本就分析到头了,现在我们知道,要获得flag,需要满足如下条件:

1.req.Ops为fetch

2.req.Target要以http://或https://开头,且包含file:/flag("http://www.amoda.com file:/flag"这样就行)

下一步就是分析pyhon文件了:

回到我们开始讲的通信函数:

image-20260414202843290

这里的BACKEND_URL在第8行有定义:

BACKEND_URL = os.environ.get("BACKEND_URL", "http://backend:8080/api/monitor")

直接将json数据发给/api/monitor路由,看看函数调用:

image-20260414203025881

我们发给后端的数据是这个normalized,倒推原始内容,post发给这个路由就行了:

从头开始看:

首先函数只接收json格式,然后转换成数组给到_sanitize_payload函数:

_sanitize_payload:

image-20260414203407727

遍历键值对,要求键不得有特殊符号:

image-20260414203651664

然后又把key交给_normalize_key(确实很绕。。):

image-20260414203801447

其实就是k.lower

然后回到90行,接着调用一个函数:

image-20260414204100537

没什么好说的,限制开头和黑名单

然后就到了重点:

image-20260414204244628

image-20260414204302324

翻译成代码就是:

normalized["Ops"] = "httpcheck"
normalized["target"] = target

这下真难办了,既要Ops等于httpcheck,又要等于fetch,这也是这题最大的考点:

json.Unmarshal的折叠匹配算法

解释如下:

根据 Go 官方文档和源码逻辑,json.Unmarshal 在将 JSON 数据填充到结构体时,遵循以下匹配优先级:

  1. 精确匹配:JSON 的 key 必须与结构体字段的 json 标签或字段名完全一致(区分大小写)。
  2. 大小写折叠匹配:如果精确匹配失败,Go 会尝试忽略大小写进行匹配。

所以我们就是要通过折叠算法覆盖掉原本的Ops达到进入判断的目的

历史上存在过很多 s 的变体,比如:

ſ (U+017F):拉丁小写字母长 S。在古英语或德语(如 ſt 写作 ſt)中常见。

K (U+212A):开尔文符号。

我们这里用ſ

ſ (U+017F):在 Unicode 的“大小写折叠”规则中,它被定义为 s 的等价字符。

我们回到go文件,找到这个函数:

image-20260414205203715

json.Unmarshal 是 Go 语言标准库 encoding/json 中用于反序列化(解码)的核心函数

当他发现精确匹配无法匹配Ops时,就会调用折叠匹配,把我们构造的Opſ 当作Ops,覆盖原来的httpcheck

(其实我感觉很像python中的全角字符绕过)

那我们就可以构造payload如下:

{
"ops":"amoda",
"op\u017f":"fetch",
"target":"http://amoda.com file:/flag"
}

再套个requests发给/api/probe路由即可:

import requests
url ="xxxx/api/probe"
payload={
"ops":"amoda",
"op\u017f":"fetch",
"target":"http://amoda.com file:/flag"
}re = requests.post(url,json=payload)
print(re.text)

通过网盘分享的文件:e76edf210e6e4b86827c99bccade6518.zip
链接: https://pan.baidu.com/s/13YDsxGGORGoZBKzLguI5aQ 提取码: 8c49
--来自百度网盘超级会员v3的分享

完结撒花

http://www.jsqmd.com/news/641513/

相关文章:

  • 预算少就不做推广?五大 “性价比之王” 软文发布平台综合评测与选择指南 - 博客湾
  • 从L0原始日志到L4业务意图追踪:AIAgent全栈Trace建模方法论(基于37个客户POC验证的7阶抽象模型)
  • 多模态大模型驱动自动驾驶的临界突破(2024实测数据首次公开):时延<83ms、跨模态误检率下降67.4%、通过ISO 21448 SOTIF认证的关键路径
  • 如何5分钟搞定抖音批量下载:douyin-downloader开源工具终极指南
  • 2026媒体发稿平台实测榜:6大主流平台10大核心维度硬核全拆解 - 博客湾
  • 2026 年整合软文发稿平台 TOP5 榜单:从软文发稿到自媒体全网分发 - 博客湾
  • Jitsi Meet移动端热更新:无需应用商店的功能升级方案
  • 终极指南:如何用罗技鼠标宏在绝地求生中实现完美压枪
  • TOP5 媒体发稿平台推荐:高效传播助力品牌推广 - 博客湾
  • PyTorch中通过训练图像去雾数据集 建立基于SFNet图像去雾算法的完整系统
  • 告别数据孤岛:Mantle与Flutter混编实现跨平台数据无缝流动
  • Quill 编辑器光标跳转到顶部的解决方案
  • 探秘LibSass:从源码到CSS的完整编译之旅
  • 简易DDS发生器制作
  • Qwen3-32B大模型并发性能优化实战:从理论估算到压力测试
  • 托福备考双指南:家长选型攻略+零基础痛点破解 2026权威版 - 速递信息
  • 不只是ChatGPT:手把手教你配置Agent,让它学会从‘学习强国’找会议素材
  • Media Player Classic Home Cinema:Windows媒体播放器的终极免费解决方案
  • 【原创】IgH EtherCAT主站详解(十三)--EtherCAT 线缆冗余与双网卡故障切换机制
  • 兰亭妙微大厂产品细节白皮书:8个高频复用的设计思路与典型应用案例 - ui设计公司兰亭妙微
  • 【CANN训练营】自定义算子开发实战指南
  • 3分钟掌握抖音批量下载神器:无水印视频一键搞定
  • 终极指南:如何优化Meridian营销组合模型性能
  • 终极Authlogic社区生态指南:探索活跃开源项目与实战最佳实践
  • 终极指南:如何免费下载Steam创意工坊模组,无需Steam账号!
  • 如何将3D模型转换为Minecraft建筑:ObjToSchematic完整指南
  • 如何快速搭建App Privacy Policy Generator:从项目结构到技术选型全解析
  • ExtractorSharp:5步掌握专业游戏资源编辑工具的高效使用
  • 虚拟机与主机高效共享文件的配置指南
  • 如何5分钟上手franc:初学者完整安装与使用指南