JNI 绕过RASP
在学习RASP的时候,其中有一种绕过RASP的方法是,使用JNI,让Java调用底层C语言,从而绕过危险函数的Hook检查 JNI(Java Native Interface),其作用是让Java程序可以去调用C语言的程序,Java的实现是基于C语言实现的,在很多底层方法中,我们也经常能看到一些 n…
CATEGORY / Java
篇研究记录,按年份分组、发布时间倒序排列。使用分类与标签继续缩小技术范围。
在学习RASP的时候,其中有一种绕过RASP的方法是,使用JNI,让Java调用底层C语言,从而绕过危险函数的Hook检查 JNI(Java Native Interface),其作用是让Java程序可以去调用C语言的程序,Java的实现是基于C语言实现的,在很多底层方法中,我们也经常能看到一些 n…
前面学习Hessian反序列化时,发现只有Rome反序列化这一条链是我学习过的,现在来补一补没有学过的链子 该链依赖于 spring-aop 和 aspectjweaver 两个包,在pom.xml文件中导入以下依赖 或者在springboot的 spring-boot-starter-aop 中自…
最近来学习一下Hessian反序列化,感觉这个组件也是非常常见的,看了看感觉有点类似于RMI的远程方法调用,但是触发点并不是 readObject 了,变成了 hashCode/equals/compareTo 其中之一 Hessian 是一种基于二进制的轻量级网络传输协议,用于在不同的应用程序之间…
在《Java安全share》星球中,jsjcw师傅给出了 在高版本JDK下的spring原生链 POC,当时就想去研究一下这条链子,可惜其中有很多知识点我都没有接触过,所以这条链子的学习周期拉的长了一些 新建一个JAVA项目,JDK版本为17 向pom.xml文件中导入如下依赖 1 2 3 4 5…
最近在分析《高版本JDKSpring原生反序列化链》时,其中有一个知识点为《JACKSON链的不稳定性》,前来学习一下(有个很奇怪很奇怪的事情,为什么我的Jackson链子十分的稳定, outputProperties 总是第一名……初步猜测为本人电脑环境问题) 在调用该Jackson链,调用任意类…
最近爆出来一个《高版本JDK下的Spring原生反序列化链》,本来想着学习一下最前沿的新东西,看了一下其它师傅的分析文章,好多没见过的知识点,慢慢补吧... 这里我使用JDK17,因为最新的Spring原生反序列化链是基于JDK17的 该链子的入口点为`EventListenerList#readO…
Jackson 是一个开源的Java序列化和反序列化工具,可以将 Java 对象序列化为 XML 或 JSON 格式的字符串,以及将 XML 或 JSON 格式的字符串反序列化为 Java 对象。 本次Jackson反序列化使用Jackson版本为2.7.9,导入依赖如下 1 2 3 4 5 6 7…
最早的最早,从分布式概念出现以后,工程师们,制造了一种,基于Java语言的 远程方法调用 的东西,它叫RMI(Remote Method Invocation),我们使用Java代码,可以利用这种技术,去跨越JVM,调用另一个JVM的类方法。 因为任何东西都是基于socket, RMIClient…
好久之前的文章了,忘记发了 只需JDK7u21 JDK7u21的核心点就是`sun.reflect.annotation.AnnotationInvocationHandler` 我们可以看到 AnnotationInvocationHandler 中的 equalsImpl 方法 其中有一个明显的…
最近看了看了一些数据库驱动,想起来经常利用的H2数据库的驱动,但是还没分析过源码,所以今天来浅析一下 H2数据库是一款用Java编写的轻量级开源关系型数据库,支持嵌入式和服务器模式。它以其高性能、便捷性和灵活性,广泛应用于开发和测试环境。 h2数据库是纯Java的,因此跨平台使用更加方便。 在使用…
之前学习过通过Mysql驱动进行JDBC反序列化,最近有听到JDBC不出网的利用方式,今天来学习一下 受影响版本如下: < 42.2.25 >= 42.3.0,< 42.3.2 首先在本地构造一个触发漏洞的环境,在pom.xml中导入PostgreSQL依赖 1 2 3 4 5 6 7 8 9 10…
常见的有两种,Controller内存马和Interceptor内存马,有了前面学习Tomcat的Filter、Servlet、Listener和Valve内存马的学习,学习Spring内存马感觉到是比较轻松的 Spring的相关基础,都是之前在一点点瞎学习和审计SpringBoot系统中学到的,也…
基于Tomcat的内存马类型有四种:Filter、Servlet、Listener和Agent。 在之前的面试中,有个问题是:如果不是基于Tomcat的Java网站,该如何注入内存马。当时没有了解到Agent内存马,现在才知道, Agent内存马是不受Tomcat框架限制的,因此来学习研究一下 学了…
在审计一套源码的时候,mt告诉我的漏洞中,有一个从来没见过没听过的漏洞 —— Groovy脚本执行,今天简单看一下吧 导入依赖如下: 1 2 3 4 5 < dependency > < groupId > org.codehaus.groovy </ groupId > < artifactId…
最近在审计系统的时候,复现一个SSTI模板注入的漏洞,感觉SSTI的危害程度挺高的,因为感觉不是很了解原理,所以详细来学习一下SSTI漏洞 SSTI(服务器端模板注入),在模板引擎解析模板时,因为代码实现的不严谨,可以将恶意代码注入到模板中,从而达到执行任意代码的功能。 Java中常用的模板有三个:…
之前面试的时候,有问过我:”在黑盒测试中,找到一个反序列化过程的点,你该怎么找可用的Gadget“,当时不太清楚有这种方式,回答所有gadget都爆破一下……今天来看一下如何用URLDNS链探测可用Gadget 虽然将所有的gadget都测试一遍的方法也是可行的,但是单纯的盲测工作量会非常巨大,而且…
文章首发于: freebuf.com 已经好久没有写博客了,这段时间花了点时间学了点内网的知识,内网相关笔记后续可能会发了。这两天渗透的时候,进入到了一个若依系统中,发现有接口可以通过数据库连接源连接,想到了之前看过但是还没学习的JDBC反序列化的链子,今天学习一下。(要是之前就学了是不是这个就能打…
XStream 是一个 Java 库,用于简化 Java 对象与 XML 之间的相互转换(序列化与反序列化)。它允许开发人员将 Java 对象直接转换为 XML 格式,或从 XML 恢复为原始对象,无需编写复杂的解析代码。 这里我们来看如何使用XStream进行序列化和反序列化操作 首先定义接口 1…
Log4j感觉还是比较好利用的,在shagou大佬的面试中,给出一个log4j漏洞绕过payload,要求分析研判,虽说能一眼看出时log4j的利用,但是也是头一次见了。 JDK8u65 Log4j 2.14.1 CC3.2.1 在8u191后,Log4j还是可以利用的,但是要用高版本的绕过手段 依…
对于我们之前学习的Tomcat内存马,只算是做了一些简单的实验,并未能够完全应用,只能通过文件上传jsp的方式来注入内存马,也是存在文件落地的现象的,并非真正的内存马 所以这篇文章,我们来学习利用反序列化来实现真正的内存马注入,本文会使用CC11链来进行内存马的注入,实现真正的无文件落地内存马,在使…
大多数的WAF受限于性能影响,当request足够大时,WAF就可能因为性能原因而做出让步,超出检查长度的内容,将不会被检查。这一点在一些CTF的题目中有所体现。 虽然这样可以绕过检测,但是我们的序列化数据是二进制数据,直接加入垃圾数据破坏了序列化的结构,在readObject反序列化的时候并没有反…
该回显方法是基于 proc/self/fd/i 的攻击 在Linux环境下,可以通过文件描述符 proc/self/fd/i 获取到网络连接,在Java中我们可以直接通过文件描述符获取到一个Stream对象,对当前网络进行读写操作,可以釜底抽薪在根源上解决回显问题。简单来说就是利用linux文件描述…
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的S…
今天该学习SnakeYaml这条链子了,大概看了一遍文章,相比于刚学的ROME,难度还是有的 根据了解,SnakeYaml是Java的yaml解析类库,支持Java对象的序列化与反序列化(看见和FastJson比较像哈),我们来了解一下简单的yaml语法 YAML对于大小写是敏感的 使用缩进代表层级…
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。 JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。 使用Java程序访问数…
在 Spring3 中引入了 Spring 表达式语言(Spring Expression Language,简称 SPEL),这是一种功能强大的表达式语言,支持在运行时查询和操作对象图,可以与基于 XML 和基于注解的 Spring 配置还有 bean 定义一起使用。 在 Spring 系列产品中…
今天来学习 EL表达式注入 EL(全称 Expression Language)表达式语言 作用 : 简化JSP页面内的Java代码 主要作用为 **获取数据 。**从域中获取数据,然后将数据展示出来 用法 : 使用的前提是通过page标签设置不忽略EL表达式 1 <%@ page contentT…
tomcat的内部结构 tomcat由Connector和Container两部分组成 Connector主要负责对外的网络交互,当收到网络请求时,它将请求包包装为Request,再将Request交给Container进行处理,最终返回给请求方 tomcat中的Container有四种,分别为 e…
Java Web 开发中的监听器(Listener)就是 Application、Session 和 Request 三大对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件。 Listener三个域对象 ServletContextListener HttpSessionListe…
从图中可以看出,我们的请求会经过 filter 之后才会到 Servlet ,那么如果我们动态创建一个 filter 并且将其放在最前面,我们的 filter 就会最先执行,当我们在 filter 中添加恶意代码,就会进行命令执行,这样也就成为了一个内存 Webshell 首先在IDEA中创建Ser…
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 它在应用程序中的位置如下图所示,很类似于中间件 客户端发起http请求,比如get类型 Servlet容器接收到请求…
今天学习一下FastJson 中 1.2.62 - 1.2.68 的反序列化漏洞,思路的话和之前一样基于黑名单的绕过,但是大部分还是在 AutoType 开启的情况下,且基本都基于存在其他的依赖的条件下 需要开启AutoType FastJson <= 1.2.62 JNDI注入可利用的 JDK 版…
这篇主要是讲一下Fastjson中版本>= 1.2.25后补丁的绕过方式 tips: 都必须开启AutoTypeSupport才能成功 想要绕过后续版本,我们就一定要知道哪里做了修改 修补方案就是将 DefaultJSONParser.parseObject() 函数中的 TypeUtils.loa…
JDK8u65 1.2.22 <= Fastjson <= 1.2.24 pom.xml 文件导入如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <dependency> <groupId>com.unboundid</groupId> <…
Fastjson 是 Alibaba 开发的 Java 语言编写的高性能 JSON 库,用于将数据在 JSON 和 Java Object 之间互相转换。 提供两个主要接口来分别实现序列化和反序列化操作。 JSON.toJSONString 将 Java 对象转换为 json 对象,序列化的过程。…
**JNDI(Java Naming and Directory Interface,Java命名和目录接口)**是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名…
在Java高版本中,在 RegistryImpl 类中新加了一个 registryFilter 方法,里面对所传入的序列化对象的类型进行了限制 1 2 3 4 5 6 7 8 9 10 11 12 if (String.class == clazz || java.lang.Number.class…
前面我们进行了RMI源码层面的分析,这里我们来讨论RMI的攻击方式 根据源码层面分析,我们有以下几种基本攻击方式 客户端 打 注册中心 客户端 打 服务端 客户端 不管是服务端或者客户端,与注册中心交互主要是下面这句话 1 r.bind( "remoteObj" ,remoteObj); 除了 bi…
分析完CC1-7,继续分析一下CC11,CC11使用字节码加载,它其实是CC2+CC6的组合变形 漏洞版本:cc组件3.1-3.2.1 这里我把CC链子的流程图放上来,实际根据CC1-7,可以衍生出来很多CCN CC2链流程 1 2 3 4 5 6 7 8 9 10 /* Gadget chain:…
今天我们精进shiro的反序列化!!! 之前有做过相关的shiro550与721的复现,不过都是利用工具的,没有理解里面的原理 550的话是由于他的密钥是固定的,是可以爆破的,经过Base64和AES解密以后,可以将里面的内容构造为恶意代码,从而达到RCE的目的 在登录界面有remember me的…
cc5的后半部分和之前是一样的,只是在调用LazyMap的get方法时,使用的是 TiedMapEntry 的 toString 方法,相当于是提供了一个新的入口 这里 TiedMapEntry 的同 toString 方法调用了 getValue 方法,而 getValue 方法调用了map的 g…
cc7与cc5大同小异,也是后面部分不变,变的只是入口的地方 cc7这里的入口点使用了 Hashtable 这里我们简单分析一下,入口类是 Hashtable 的 readObject ,调用本身的 reconstitutionPut 方法,进入 reconstitutionPut 看一下(这里我们…
之前这里没有搞明白,这次这里动态调试了一下,发现应该是差不多了,回来补一下 在这里add之后进行了下列操作,就是将add的元素,放入了queue数组中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 priorityQueue.add(templ…
之前讲的几条链子,都是在commons-collections3.2.1版本之前的攻击链,cc4是在commons-collections4.0版本中的一条链子 实际上,这条链子还是换汤不换药,只是中间执行的方式换了一下,后面还是命令执行和代码执行两种方式 这里用到的是 TransformingCo…
ysoserial中使用 TrAXFilter 类,来触发 newTransformer 方法,最后也可以成功进行类加载 这里我们也进行分析一下 我们来看`TrAXFilter`的构造函数,构造时需要传入一个templates ,然后调用他的`newTransformer`方法,但是这个类并没有继承…
CC3这条链子和前面的两条链有些不同,在这条链子中我们使用了 动态类加载 替换掉了 Runtime.exec ,由 命令执行 换为了 代码执行 我们来回顾一下动态类加载: ClassLoader中的 loadclass 调用 findClass , findCLass 调用 defineClass…
tips:cc6这条链是不受jdk版本限制的 cc6的入口换成了 HashMap 的 readObject 方法,这条链实际是要调用 LazyMap的get方法 ,后面的部分就和ysoserial中的cc1后半链一样了 当时我们说URLDNS链中讲到了 HashMap 的 readObject 方法…
ysoserial中的cc1和我们前面所说后半部分是一样的,这里就不细说 在ysoserial中的cc1是用LazyMap替换了 TransformedMap 现在使用 LazyMap 的 get 方法去触发 ChainedTransformer 的 transform 方法 下面为LazyMap的…
Java反序列化原理: 接受任意对象,执行readObject方法 若有一个A的readObject方法,调用了O1.method1方法,则我们可以修改这个O1 且在O1.method1方法中,调用了O2.method2方法,则我们可以修改这个O2 …… 最后调用了危险方法(Runtime.getR…