2026CISCN总决赛——Archivehub
某高校在内网中部署了一个离线资料归档平台 ArchiveHub,用于上传课程资料、比赛资料和安全培训文档。 平台支持上传 zip 归档包,系统会读取其中的 manifest.json 并渲染指定 Markdown 文件。普通用户可以把自己的文档提交给管理员审核,管理员审核完成后会在文档下方留下 Review Notes。 请获取服务器中的 flag
初步思路
从前面的配置项来看分为两个服务,外网就是我们看到的提交包含 markdown 文件的压缩包,其进行渲染,事后 bot 管理员可以进行留言
因此这里大体上来看会通过 XSS 结合 SSRF 去让 bot 进行内网服务的操作
定位到后续内网服务
那就是打 SSTI 模板注入了 http://127.0.0.1:9001/render?tpl={{8*8}}
一些细节
注意到 Cookie 属性设置了 HttpOnly; SameSite=Lax,虽然无法读取 Cookie,但我们可以进行携带;
接着看到了一些转义过滤限制如下
1234567891011121314151 ...
RMI反序列化
RMI (Remote Method Invocation,远程方法调用)
简单来说,RMI 能够让在客户端 Java 虚拟机上的对象像调用本地对象一样调用服务端 Java 虚拟机中的对象上的方法,提供的一种用于实现分布式计算的 API
想象一个大型的技术文档库,他们分散在 A、B、C 三台服务器上,如果没有 RMI 我们需要使用自己的客户端分别建立三个 Socket 连接,手动发送搜索指令,处理三份不同的数据流,最后再合并;而现在我们可以分布式部署 RMI 服务,并定义一个 SearchService 接口,客户端只需要依次调用 A、B、C 上的 search 方法即可
RMI 核心工作机制
整个通信流程我们可以看作是各自的代理进行交互:
Stub (客户端代理): 实现了远程接口,暴露给客户端程序,并不进行真正的实现
Skeleton (服务端代理): 运行在服务端,负责接收请求根据 Stub 发送的数据进行操作
🌟注册表查询:事实上 Stub 存根实例是在服务端生成的,其序列化后会存储绑定在服务端上的注册表中,客户端需要访问注册表来反序列化得到 Stub ...
WindowsTerminal仿Ghostty终端外观风格设置
原文章来自 lostsheep 佬友的终端精致小玩具 - Ghostty
后经过 ai 帮我生成了 Windows 端的相关文件设置
效果图:
Windows Terminal settings.json 设置
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798{ "$help": "https://aka.ms/terminal-documentation", "$schema": "https://aka.ms/terminal-profiles-schema", "actions": [], "copyFormatti ...
第三届“长城杯”总决赛Web题目部分wp
eznginx
源标题不是这个,但是这里只保留了附件
访问根路由,提供了以下 /api
123456{ "app": "theme-assets", "preview": "/api/v2/preview/demo/download", "ops": "/api/v2/preview/admin/sync/job", "upload": "/api/v2/preview/admin/sync/upload"}
其中 preview 功能只是摆设,实际并没有实现任何后端逻辑
至于另外两个功能,由于请求的路径会通过 buildAuthCandidate 方法处理检测是否匹配以下正则表达式,该配置在 application.yml 中
1auth-pattern: "^/api/v2/preview/[A-Za-z]+.*?/download$"
123456789101112131 ...
CommonsCollections4-5-6-7链分析
CommonsCollections 4
CC 4 依赖于 commons-collections4 : 4.0,基础版本其实很简单,在 CC 2 TemplatesImpl 链子的基础上将 InvokerTransformer 替换为 CC 3 中使用的 InstantiateTransformer 来触发 newTransformer() 方法
1234567891011121314Transformer[] transformers = new Transformer[] { new ConstantTransformer(TrAXFilter.class), new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(transformers); ...
CommonsCollections3链分析
既 CC 1 和 CC 2 的学习之后,两者本质上还是去触发 InvokerTransformer.transform() 来反射调用方法,在引入了 TemplatesImpl 之后,是否能找到一种链子可以直接触发其 newTransformer 方法来加载字节码?CC 3 就是为此而生
既然如此,我们依旧对 newTransformer Find Usages,关注 TrAXFilter 类
1234567public TrAXFilter(Templates templates) throws TransformerConfigurationException { _templates = templates; _transformer = (TransformerImpl) templates.newTransformer(); _transformerHandler = new TransformerHandlerImpl(_transformer); _useServicesMechanism = _transfor ...
CommonsCollections2链分析
既 CC 1 分析后,了解了 Transformer 的基础知识后,后面的链子就可以快些分析了,CC 2 的利用是基于 commons-collections 4,因此我们引入依赖
12345<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency>
配合 ChainedTransformer 触发 Runtime.exec()
我们以 ChainedTransformer 作为开始
12345678910111213141516171819package org.example; import org.apache.commons.collections.Transformer; import org.apache.commons.collec ...
Transformer及CommonsCollections1链分析
在 Apache Commons Collections(以下简称 CC 链)反序列化漏洞中,Transformer 接口及其实现类是整个攻击链路的“执行类”
在解决 Java 反序列化漏洞时,我通常更喜欢将其分解为三个部分:
入口类(source):指反序列化漏洞利用的起点,通常是一个攻击者可以控制的类;重写 readObject 类、调用常见的函数(触发常见的 Java 方法,为攻击者提供了执行任意代码的机会),参数类型宽泛,最好 jdk 自带
调用链(gadget chain):是由一系列类和方法组成的链条,通过反序列化时自动调用的方法被触发,逐步调用这些类和方法,从而最终达到攻击者的目的。(相同名称相同类型:在调用链中,每个类和方法需要具有特定的签名,方法的名称和参数类型必须匹配,以确保在反序列化过程中被正确地链接和调用)
执行类(sink):是调用链的最终目的地,也是执行恶意代码或完成攻击者意图的地方
Transformer 在源码中只是一个接口类,其核心作用可以归结为:将输入对象(保持不变)转换为某个输出对象
12345package org.apache.commo ...
DIDCTF-应急响应
流量日志分析
linux-basic-command
Info
获取2015年访问请求 排名前五的ip地址
格式:flag{ip1,ip2,ip3,ip4,ip5}
附件下载下来是 HTTP 流量日志,一万多行,写个脚本好了
1234567891011121314151617181920from collections import Counter import re log_file = r"C:\Users\23800\Downloads\Compressed\access.log\access.log" pattern = re.compile(r'^(\S+) .+\[.+/(\d{4}):.+\]') counter = Counter() with open(log_file, "r", encoding="utf-8", errors="ignore") as f: for line in f: ...
Nodejs原型链污染
单独提出来是方便自己下次看到能快速浏览,之前的笔记太混乱了,链路逻辑有点混乱,一些细节也忽略掉了,借此重构一下;再者是自己本身对 nodejs 这一块的认识没有那么深刻
JavaScript 原型链
继承属性
JavaScript 对象有一条指向原型的链,当访问其属性时除了该对象,还会在其原型甚至是原型的原型中去查找该属性,直到到达原型链的末尾
想要访问一个对象的原型有两种方法,函数标准形式:通过 Object.getPrototypeOf() 和 Object.setPrototypeOf() 来访问和修改;非标准形式:JavaScript 访问器 __proto__
12let o ={} console.log(o.__proto__ === Object.getPrototypeOf(o)); // true
Note
根据 ECMAScript 标准,符号 someObject.[[Prototype]] 用于指定 someObject 的原型
这不是代码中可写的语法,而是规范中指定一个对象的记法
对于以下例子,我们显式设置 o 的 ...







