CC3_POC(JAVA7与JAVA8通杀版)
CC3 POC修改在前面的这篇Java反序列化(4)中有讲过解决高版本利用问题过程差不多 先把这条链来理清楚,这里可以看看白日梦组长的视频 1newTransformer() --> getTransletInstance() --> defineTransletClasses() --> defineClass() --> newInstance() CC1是命令调用,CC3是动态类加载。 具体做法就跟Java反序列化(4)中讲的一样,把TransformerMap改成LazyMap 完整的POC: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980package org.example;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesIm ...
CC3
CommonsCollections3这篇继续来跟着P牛的《Java安全漫谈》学习,前面有讲Java中加载字节码的一些方法,就介绍了TemplatesImpl。TemplatesImpl是一个可以加载字节码的类,通过调用其newTransformer()方法,就可以执行这段字节码的类构造器。那么,我们是否可以在反序列化漏洞中,利用这个特性来执行任意代码 利用newTransformer执行任意代码-先来想一下CommonsCollections1,前面在Java反序列化(2)这篇文章中有给出一个简单的demo,可以利用TransformedMap来执行任意Java方法 1234567891011121314151617181920package org.example;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.functor ...
Java动态加载字节码
Java动态加载字节码这次是Java字节码学习,依旧是跟着P牛 Java字节码是什么Java字节码是在Java虚拟机执行时用的一类指令,这是一种中间代码,是Java源代码经过编译后生成的一种二进制文件,使得Java具有跨平台的特性 在P牛写的这篇动态加载字节码中,所有能够恢复成一个类并在JVM虚拟机里加载的字节序列,都在探讨范围内。 我前面有一篇讲过这个ClassLoader,在很多场景中,我们可以有控制一些能够加载字节码函数的能力,那么可以通过加载远程的恶意类,来完成RCE。 如何加载类URLClassLoaderJava的ClassLoader是用来加载字节码文件最基础的方法,它就是一个加载器,来告诉Java虚拟机如何加载这个类。Java默认的ClassLoader就是根据类名来加载类,这个类名是类完整路径,比如java.lang.Runtime 就先来说一下这个URLClassLoader URLClassLoader实际上就是我们平时默认使用的AppClassLoader的父类,所以,解释URLClassLoader的工作过程实际上就是在解释默认的Java类加载器的工作流程。 ...
Java反序列化(4)
Java反序列化(4)CC6前面几篇详细分析了CommonsCuollections1这个利用链和其中的LazyMap原理。但是我们说到,在Java 8u71之后,这个利用链不能再利用了,主要原因是sun.reflect.annotation.AnnotationInvocationHandler#readObject的逻辑变化了。 在ysoserial中,CommonsCollections可以说是commons-collections这个库中相对比较通用的利用链,为了解决高版本Java的利用问题,我们先来看看这个利用链。 先看看简化版利用链: 12345678910111213141516/*Gadget chain: java.io.ObjectInputStream.readObject() java.util.HashMap.readObject() java.util.HashMap.hash() org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode() org.apache.commons.col ...
Java反序列化(3)
JAVA发序列化(3)这是Java反序列化学习的第三篇文章 这回来讲一下最纯正的CC1链,因为CC1链中利用的是LazyMap而不是TransformedMap。那么LazyMap又是什么 LazyMapLazyMap和TransformedMap类似,都来自Common-Collections库,并继承AbstractMapDecorator。 LazyMap的漏洞触发线和TransformedMap唯一的差别是,TransformedMap是在写入元素的时候执行teansform,而Lazymap是在其get方法中执行的factory.transform。因为LazyMap的作用是懒加载,在get找不到值的时候,会调用factory.transform方法去获取一个值: 123456789public Objecy get(Object key){ // create value for key if key is not currentls in the map if (map.containsKey(key) == false) { Object valu ...
Java反序列化(2)
JAVA反序列化(2)这篇是反序列化学习的第二篇 参考文章:P牛的《JAVA安全漫谈》 ,ek1ng学长的Java 反序列化安全入门——从URLDNS到Commons-Collections URLDNSURLDNS是ysoserial中的一个利用链的名字,这个ysoserial在我之前写的RMI小记中有说过。 这个URLDNS的参数仅仅是一个URL,其能触发的结果也不是命令执行,而是一次DNS请求。 这条链是使用Java内置的类构造,没有依赖第三方库,同时也不需要漏洞点有回显就可以通过DNS请求来的值是否存在反序列化漏洞 下面是ysoserial的URLDNS的代码: 1234567891011121314151617181920212223242526272829303132333435363738394041public class URLDNS implements ObjectPayload<Object> { public Object getObject(final String url) throws Exception { ...
java反序列化(1)
JAVA反序列化(1)放暑假了,又来学习了。之前讲RMI反序列化,这篇正式开始JAVA反序列化的学习 参考文章:《JAVA安全漫谈》 JAVA反序列化安全入门 序列化与反序列化序列化和反序列化是用来干嘛的 我们需要在网络上去传输数据,可能会用XML、YAML、JSON等数据交互格式。但是它们比较简单,对于比较复杂的数据难以表示清楚。比如想要表示一个对象,如果用JSON或者XML,定义起来就比较费劲,所以像Fastjson这类序列化库就是在JSON(XML)的基础上进行改造,通过特定语法传递对象,而像这样RMI就是直接通过JAVA内置的序列化方法,将对象转换成二进制进行传输。一旦有涉及到将对象转换成一个指定格式的数据 再从数据中还原出对象的这个过程,就有可能造成一系列安全问题 反序列化方法对比之前我们也有说过PHP反序列化的东西 Java的反序列化和PHP的反序列化有点类似,都只能将一个对象中的属性按照某种特定的格式生成一段数据流,在反序列化的时候再按照这个格式将属性拿回来,再赋值给新的对象。 JAVA提供了writeObject来允许开发者在序列化六中插入自定义数据,再在反序列化的时候 ...
python内存马分析
python内存马分析前言最近那场HNCTF有一道只能执行一次的Flask模板注入,这个预期解是用python内存马,这篇就来学习一下,做一下笔记。 原理Python常见的框架有Django、Flask,这两个都可能存在SSTI注入,Python 内存马就是利用Flask的SSTI注入来实现。 flask routeflask常规注册的方式为使用装饰器@app.route(),而实际工作的函数为装饰器里调用的self.add_url_rule() self.app_url_rule(rule,endpoint=None,view_func=None) rule: 就是url,和装饰器app.route() 的第一个参数一样,必须以/ 开始 endpoint: 就是在使用url_for()进行反转的时候,这个里面传入的第一个参数就是这个endpoint对应的值。这个值也可以不指定,默认值为函数名。 view_func: 只需要写方法名(也可以为匿名参数),如果使用方法名不要加括号,加括号表示将函数的返回值传给了view_func参数了,程序就会直接报错。 这个可以用来添加路由 fla ...
HNCTF2024_GoJava复现
HNCTF 2024 GoJava复现看题目应该就是一个用Go写的Java编译器 可以把.java文件传上去进行编译 先扫个目录看看 1python dirsearch.py -u hnctf.yuanshen.life:port 然后就可以发现有一个/js/和/robots.txt 12200 - 145B - /js/200 - 77B - /robots.txt 那就直接看看/robots.txt 12345User-agent: *Disallow: ./main-old.zipUser-agent: *Disallow: ./main.go 很好,这个./main.go被403了,还有个./main-old.zip,盲猜是题目源码,访问一下下载下来 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 ...
CVE-2019-9625分析
CVE-2019-9615分析这是一个OFCMS的Sql注入漏洞 OFCMS是基于Java技术的内容管理系统,在v1.1.3之前的OFCMS中发现了一个问题,在admin / system / generate / create?sql =路径可以进行SQL注入,与SystemGenerateController.java文件相关 但总的来说这个漏洞还是比较的鸡肋,前提是得进入到后台 下面来进行一些分析和复现 环境搭建先去gitee把源码搞下来,整一个v1.1.2版本的 https://gitee.com/oufu/ofcms/releases 直接用idea打开项目就好了(高版本的是这样的) 然后再ofcms-admin/src/main/resources/dev/conf/文件夹下打开db.properties,修改数据包的账号密码 修改根目录下的pom.xml,搜索mysql,然后修改成自己机器上装的版本,然后点击import changes 然后就是下载所需要的jar包 先右键这个ofcms项目的文件夹然后点这个Maven -> Reimport 点击run -> ...