URLDNS审计
ysoserial(https://github.com/frohoff/ysoserial) URLDNS源码 @PayloadTest(skip = "true") @Dependencies() @Authors({ Authors.GEBL }) public class URLDNS implements ObjectPayload<Object> { public Object getObject(final String url) throws Exception { //Avoid DNS resolution during payload creation //Since the field <code>java.net.URL.handler</code> is transient, it will not be part of the serialized payload. ...
LazyMap审计
LazyMap是什么?LazyMap和TransformedMap类似,都来自于Common-Collections库,并继承自AbstractMapDecorator 而在LazyMap中,调用map.put()的方式是 当get方法里面在获取的值为空时,会使用factory.transfor()方法去获取值 public Object get(Object key) { // create value for key if key is not currently in the map if (map.containsKey(key) == false) { Object value = factory.transform(key); map.put(key, value); return value; } return map.get(key); ...
Java反射(二)
在一个类中没有无参构造方法,也没有类似单列模式留下的静态方法我们可以使用新方法 getConstructor . 和getMethod类似,getConstructor 接收的参数是构造函数列表类型,因为构造函数也支持重载, 所以必须用参数列表类型才能唯一确定一个构造函数。 我们常用的另一种执行方法是 ProcessBuilder,我们使用反射来获取其构造函数,然后调用**start()**来执行函数 Class<?> clazz = Class.forName("java.lang.ProcessBuilder"); ((ProcessBuilder)clazz.Constructor(List.class).newInstance(Arrays.asList("calc.exe"))).start(); ProcessBuilder有两个构造函数 public ProcessBuilder(List command) public ProcessBuilder(String…...
ClassLoader(类加载器)
JVM默认加载器分为四种 BootstrapClassLoader(引导类加载器) ExtensionClassLoader(扩展类加载器) AppClassLoader(App加载器) UserDefineClassLoader(自定义加载器) 双亲委派机制 JVM三种加载器相互配合使用,按需加载,当我们需要使用该类的时候,就会生成class文件加载到内存当中生成class对象使用,加载的过程使用的就是双亲外派机制,如上图 双亲委派就是特定的加载器接收到了加载类的请求,然后会先将任务委托给父类来进行请求,父类接收到请求,如果它还有父类他就会继续向上请求,接着请求父类加载这个类,当父类无法加载这个类时,就会向下返回给子类,字类加载器才会进行加载。 双亲委派的好处 避免了重复加载使用 保证java库的安全,从外部接收到包的时候,不会将其随便解析,会先进行双亲委派进行判断,保证我们的java核心库不会被恶意篡改,类似出现用户自定义java.lang.Object类的情况 ClassLoader loadClass 加载指定的Java类 findLoadedCLass...
Java反射
通常我们想用一个类的时候,首先需要先调用import,而通过反射里面的forName可以直接调用该类 获取到类后,我们可以进一步的调用其属性、方法,也可先实例化后,在进行方法的调用 使用**newInstance()**可以调用无参构造函数 **newInstance()**可能会调用失败,原因可能是 你使用的类不是无参构造函数 你使用的可能是私有构造方法 使用 java.lang.Runtime举例 Class clazz = Class.forName("java.lang.Runtime"); clazz.getMethod("exec",String.class).invoke(clazz.newInstance(),"id"); 这样直接进行调用会出现报错 报错会告诉我们这个类不能使用私有方法 这涉及到了单列模式,Runtime是一个私有方法, 为了我们能安全的使用这个函数,设计出单列模式,通过为Runtime创建一个公共方法的getRuntime来是实现调用这个函数 Class<?>...







