第三届“长城杯”总决赛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 的 ...
第十九届CISCN暨第三届长城杯半决赛WP
第二次参加长城杯了,这次我们队伍获得第 9 名,也还好 AWDP 分拿的比较多,还有一道二进制的 fix,但本人是 web 手就没端上来了;ISW 被拉爆了,渗透这一块确实还得练,至于后面的决赛尽力而为吧。感恩一切!
AWDP
MediaDrive
break
看到反序列化函数应当警觉
这里我们可以改变 basePath,通过 file_get_contents 函数来获取内容
123456789101112131415<?phpclass User { public $name = "guest"; public $encoding = "UTF-8"; public $basePath = "/"; public function __construct($name = "guest") { $this->name = $name; }}$user = new User();echo seriali ...
JDK动态代理
其实从“动态”和“代理”两个词也可以看出其具体作用,动态可以理解为不修改源码,运行时进行;代理这里可以理解为干预,经过一个“代理层”,对目标对象的方法进行拦截和增强(例如添加日志、权限校验、事务管理等),这些是设置代理模式的典型应用。在一篇文章中也看到一个很精练的词汇,即对程序的无侵入式扩展
核心组件
JDK 动态代理完全依赖 Java 的反射机制,主要围绕 java.lang.reflect 包下的两个核心组件:
InvocationHandler 接口:需要编写一个类来实现这个接口,并重写 invoke() 方法。当客户端调用代理对象的方法时,这个调用会被自动转发到 invoke() 方法中,这里重写的就是方法执行前、执行后的增强逻辑
Proxy 类:生成动态代理类,使用静态方法 Proxy.newProxyInstance() 动态构建代理类的实例
Proxy 类动态创建 class 对象
在 Java 9 之前,proxy 类中存在一个 native 方法 defineClass0,我们可以通过该方法创建 class 对象
1234567891011121314151 ...
Java本地命令执行
关于 Java 命令执行,我们熟知的一般是使用 java.lang.Runtime 类的 exec 方法来执行本地系统命令。但实际上 exec() 并不是执行命令的终点,这点你我都心知肚明,最终一定是通过系统调用来实现,而这里我们要探讨其整个调用链过程,当目标过滤不当时,我们可以利用中间链子的方法以及反射来实现命令执行
Runtime 调用链
我们先用一个简单的一句话木马来测试
12345678910111213141516171819<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.io.InputStream" %> <%@ page import="java.io.ByteArrayOutputStream" %> <% if (request.getParameter("cmd") == nu ...









