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 ...
Java反射机制
有反射必然就有正射,而正射就是我们平时写代码的正常逻辑。直接通过类和对象调用其方法或访问其属性,这种方式是静态的,意味着编译时就已经确定了方法的调用以及对象的属性访问
1234567891011121314package org.example;class MyClass { public void sayHello() { System.out.println("Hello, World!"); }}public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.sayHello(); }}
Quote
Reflection is commonly used by programs which require the ability to examine or modi ...
JSP类加载机制
前置知识
什么是 JSP
JSP (JavaServer Pages),其是 JavaEE 标准规范的组件之一。其主要关于如何动态生成网页
JSP 是一种服务器端的渲染技术,它允许在 HTML 页面中直接嵌入 Java 代码(通常用 <% ... %> 标签包裹)。本质上经过编译后的 JSP 就是一个 Servlet 文件,JSP 只是 Servlet 的一种高级表现形式,我们可以与 PHP、ASP、ASP.NET 等类似的脚本语言进行类比
既然说到了 JSP,我认为可以先了解一下 Web 容器的一些基础概念,这是一种用于运行 Java Web 应用程序的环境,支持运行Java Servlet、JavaServer Pages (JSP) 和其他基于 Java 的 Web 组件
在 Web 应用中,不仅仅只有一个 HTTP 的请求和相应功能,Java Web 容器就还包括:
HTTP 请求/响应处理:内置支持 HTTP 协议的解析和通信。
会话管理:提供 Session 和 Cookie 的管理。
生命周期管理:Servlet、Filter 等组件的加载、 ...
SQL-Injection-Bypass
每次去找零散的 bypass 很麻烦,而且网上一些 bypass 语句并未做完整说明,想着不如自己搞一份 bypass 文档好了(这个文档会持续更新,一点点累积起来)
MYSQL
过滤空格
1.使用注释符 /**/
1select * from testtable where name = '' union/**/ select 1,2,3,version() #';
2.使用空白字符
1%0a %09 %0c %a0 %0b %0d %20
%a0 只能在特定字符集 latin1 使用,其是一个单字节字符,直接代表不间断空格
3.使用浮点数
1234select * from testtable where id = 1E0union select 1,2,3,4;select * from testtable where id = 1.0union select 1,2,3,4;select * from testtable where id = 1.union select 1,2,3,4;select * from testtable wher ...









