「java反序列话漏洞」java反序列化漏洞有哪些

博主:adminadmin 2022-11-22 10:13:09 49

今天给各位分享java反序列话漏洞的知识,其中也会对java反序列化漏洞有哪些进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

xmldecoder反序列化漏洞分析

java提供了很多xml文档解析的类库,包括dom4j,domj,SAX等库,可以进行xml文档的解析,这些库的使用不当,会导致XXE漏洞的发生,但是这些类库中,SAX库允许自己去定义整个xml文档处理的handler,可以在xml文档解析的过程中,对解析出来的节点进行一些操作

而为java反序列化定义的handler,会导致一些java反序列化的问题的发生

poc:

获取到文件内容之后,用XMLDecoder解析,在下面调用了readObject方法

进入readObject方法中

这里对文档进行了解析,而XMLDecoder.this.handler其实就是

DocumentHandler

这个handler很重要,所有反序列化的操作都是在这个类中进行的

之类通过SAXParserFactory实例化了一个SAXParser的实例,并且调用了其中的parse方法

复现过java XXE漏洞的师傅应该看见过SAXParser的用法,它允许用户自己去定义处理文档的handler

可以看到,用户可以将自己定义的Handler,只要这个类继承了DefaultHandler,可以看一下官网的例子:

自己的Handler可以在解析的不同阶段,进行不同的操作,这个特点就让xml文档成为了可以进行java序列化的载体,DocumentHandler这个handler就是处理xml文档反序列化的

接下来,调用SAXParser对xml文档进行解析,在对一些属性的设置以后,真正的解析流程在XML11Configuration这个类中的parse方法中开始

首先是对实体的解析:

因为我们的文档中并没有xml实体,所以这一步不用关注

之后进行文档的解析

进入到scanDocument函数中

这里通过next函数,解析了文档,并且返回当前解析的状态,整个文档的具体解析过程在XMLDocumentFragmentScannerImpl这个类的ContentDriver类中,里面的解析过程很复杂,具体的解析过程不要过于关注,重点在解析出来的结果的处理上

当发现当前的文档为根节点的时候,调用fContentDriver的next方法,在这里进行ROOT节点的解析

一直到XMLDocumentFragmentScannerImpl的scanStartElement方法中

在之类对文档进行解析,调用scanName解析出来第一个节点名为:java

之后寻找java节点的结束字符在哪,并且解析出来中间的所有属性

在解析结束以后,会将这个节点中的所有属性添加到fAttributes中

最后来到startElement函数中,可以认为fElementQName就是我们的节点名称,fAttributes就是这个节点中所有属性组成的一个字典

最后调用到DocumentHandler的startElement才到真正反序列化的地方

到这里,一个节点的解析就算结束了,头都看大了,先附上一张调用栈,再到DocumentHandler中看具体的反序列化过程

在最后,调用了DocumentHandler.startElement函数,我们进入看一下

在这里会根据不同的节点实例化不同的节点Handler

this.handlers中寻找java节点对应的handler,可以看一下this.handlers里面所有的handler都是什么,它是一个HashMap,在属性中有定义 private final MapString, Class? extends ElementHandler handlers = new HashMap();

在构造方法中,对handlers进行了赋值

这也就是XMLDecoder所有支持的节点类型,不同的节点会调用不同的ElementHandler进行处理,我们的java节点,应该是被JavaElementHandler处理的

回到startElement的方法中

在实例化JavaElementHandler类以后,调用了setParent将上一次的handler保存,这一步相当于将每一个节点的处理类串成了一个链

这一步获取到所有的节点属性,并且调用处理handler自己实现的addAttribute方法,可以看一下JavaElementHandler的addAttribute

这里通过我们设置的class属性的内容,获取了对应的类,也就是java.beans.XMLDecoder类的class

之后调用对应handler的startElement,而java的handler没有操作,所以进行下一个节点的解析

下一个节点是object,具体解析流程就不再分析

object对应的Handler为ObjectElementHandler,可以发现,startElement中的重点其实就是每个Handler的addAttribute方法和startElement方法

调用父类的addAttribute方法

这一步获得了ProcessBuilder的class

处理handler:ArrayElementHandler

addAttribute:

这里定义了数组元素的类型和数组大小

startElement:

这里实例化了一个数组元素,并且返回了一个ValueObject对象

void节点比较特殊,void节点其实是object节点的一个子类,它本身没有定义什么方法

我们可以不用过多的关注void节点的处理规则,只需要理解它的作用就是声明一个变量就可以,可以这么理解:

在一个节点处理结束以后,会由内向外依次调用每个节点的endElement方法

比如我们的poc

在解析完touch的string节点的之后,触发string的endElement,主要就是将将值设置为StringElementHandler的属性

之后向ArrayElementHandler中的数组添加进去这个String,对每个element都会调用getValueObject方法,而其中

void节点的endElement很有意思

看一下getContextBean方法

这里会获取上一个Handler的ValueObject的值,而这个ValueObject的value就是我们在属性中定义的对象,void节点的上一个节点是array节点,我们在array节点中定义了一个大小为2的String数组,所以获取到的ValueObject就为这个数组

因为我们只设置了void的属性为index="0",所以会进入到var4=set的条件中

最后的Express类,相当于是对var3这个对象调用其中的var4的方法,参数为var2,这样,就为这个String数组赋值了第一个值为touch

来到第二个void标签

当来到 void method="start"/

进入到getContextBean

在这里调用了parent的getValueObject方法,也就是object标签

获取了ObjectElementHandler中的ProcessBuilder对象

最后调用start执行命令

「java反序列话漏洞」java反序列化漏洞有哪些

java反序列漏洞,涉及到哪些中间件

 目前oracle还没有在公开途径发布weblogic的JAVA反序列化漏洞的官方补丁,目前看到的修复方法无非两条:

使用SerialKiller替换进行序列化操作的ObjectInputStream类;

在不影响业务的情况下,临时删除掉项目里的 "org/apache/commons/collections/functors/InvokerTransformer.class"文件。

ObjectInputStream类为JRE的原生类,InvokerTransformer.class为weblogic基础包中的类,对上述两个类进行修改或删除,实在无法保证对业务没有影响。如果使用上述的修复方式,需要大量的测试工作。且仅仅删除InvokerTransformer.class文件,无法保证以后不会发现其他的类存在反序列化漏洞。

一个完整的渗透测试流程,分为那几块,每一块有哪些内容

包含以下几个流程:

信息收集

第一步做的就是信息收集,根据网站URL可以查出一系列关于该网站的信息。通过URL我们可以查到该网站的IP、该网站操作系统、脚本语言、在该服务器上是否还有其他网站等等一些列的信息。

漏洞探测

当我们收集到了足够多的信息之后,我们就要开始对网站进行漏洞探测了。探测网站是否存在一些常见的Web漏洞,比如:SQL注入 。

漏洞利用

探测到了该网站存在漏洞之后,就要对该漏洞进行利用了。不同的漏洞有不同的利用工具,很多时候,通过一个漏洞我们很难拿到网站的webshell,我们往往需要结合几个漏洞来拿webshell。

内网渗透

当我们能跟内网主机进行通信后,我们就要开始进行内网渗透了。可以先使用nmap对内网主机进行扫描,探测在线的主机,并且探测其使用的操作系统、开放的端口等信息。

内网中也有可能存在供内网使用的内网服务器,可以进一步渗透拿下其权限。

痕迹清除

达到了目的之后,有时候只是为了黑入网站挂黑页,炫耀一下;或者在网站留下一个后门,作为肉鸡,没事的时候上去溜达溜达;亦或者挂入挖矿木马。

撰写渗透测试保告

在完成了渗透测试之后,就需要对这次渗透测试撰写渗透测试报告了。明确的写出哪里存在漏洞,以及漏洞修补的方法。以便于网站管理员根据我们的渗透测试报告修补这些漏洞和风险,防止被黑客攻击。

北大青鸟java培训:如何防止java编程语言序列化网络攻击?

java编程一直以来都是互联网软件开发市场上的主流开发语言,同样的这也就导致了只要发生漏洞的话,所有用java编程开发的软件都会出现问题,下面广东java培训就一起来了解一下,java编程语言中的序列化问题应该如何解决。

什么是序列化?自从1997年发布JDK1.1以来,序列化已经存在于Java平台中。

它用于在套接字之间共享对象表示,或者将对象及其状态保存起来以供将来使用(反序列化)。

在JDK10及更低版本中,序列化作为java.base包和java.io.Serializable方法的一部分存在于所有的系统中。

序列化的挑战和局限序列化的局限主要表现在以下两个方面:出现了新的对象传输策略,例如JSON、XML、ApacheAvro、ProtocolBuffers等。

1997年的序列化策略无法预见现代互联网服务的构建和攻击方式。

进行序列化漏洞攻击的基本前提是找到对反序列化的数据执行特权操作的类,然后传给它们恶意的代码。

序列化在哪里?如何知道我的应用程序是否用到了序列化?要移除序列化,需要从java.io包开始,这个包是java.base模块的一部分。

常见的使用场景是:实现Serializable接口和(可选)serialversionuid长整型字段。

使用ObjectInputStream或ObjectOutputStream。

使用严重依赖序列化的库,例如:Xstream、Kryo、BlazeDS和大多数应用程序服务器。

使用这些方法的开发人员应考虑使用其他存储和读回数据的替代方法。

EishaySmith发布了几个不同序列化库的性能指标。

在评估性能时,需要在基准度量指标中包含安全方面的考虑。

默认的Java序列化“更快”一些,但漏洞也会以同样的速度找上门来。

我们该如何降低序列化缺陷的影响?项目Amber包含了一个关于将序列化API隔离出来的讨论。

我们的想法是将序列化从java.base移动到单独的模块,这样应用程序就可以完全移除它。

在确定JDK11功能集时并没有针对该提议得出任何结果,但可能会在未来的Java版本中继续进行讨论。

通过运行时保护来减少序列化暴露一个可以监控风险并自动化可重复安全专业知识的系统对于很多企业来说都是很有用的。

Java应用程序可以将JVMTI工具嵌入到安全监控系统中,通过插桩的方式将传感器植入到应用程序中。

其他有用的安全技术在进行维护时,可以不需要手动列出一长串东西,而是使用像OWASPDependency-Check这样的系统,它可以识别出已知安全漏洞的依赖关系,并提示进行升级。

也可以考虑通过像DependABot这样的系统进行库的自动更新。

虽然用意很好,但默认的Oracle序列化过滤器存在与SecurityManager和相关沙箱漏洞相同的设计缺陷。

因为需要混淆角色权限并要求提前了解不可知的事物,限制了这个功能的大规模采用:系统管理员不知道代码的内容,所以无法列出类文件,而开发人员不了解环境,甚至DevOps团队通常也不知道系统其他部分(如应用程序服务器)的需求。

5.java反序列漏洞,涉及到哪些中间件

Boss、Jenkins、OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行。

然而事实上,博客作者并不是漏洞发现者。博客中提到,早在2015年的1月28号,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上给出了一个报告[5],报告中介绍了Java反序列化漏洞可以利用Apache Commons Collections这个常用的Java库来实现任意代码执行,当时并没有引起太大的关注,但是在博主看来,这是2015年最被低估的漏洞。

确实,Apache Commons Collections这样的基础库非常多的Java应用都在用,一旦编程人员误用了反序列化这一机制,使得用户输入可以直接被反序列化,就能导致任意代码执行,这是一个极其严重的问题,博客中提到的WebLogic等存在此问题的应用可能只是冰山一角。

虽然从@gebl和@froh

【CVE-2016-4437】Shiro反序列化漏洞复现

Apache Shiro是一款开源的java安全框架,执行身份验证、授权、密码和会话管理。

Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为rememberMe的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。

Apache Shiro =1.2.4

使用vulhub搭建环境

尝试登录,登录的返回包中有 rememberMe=deleteMe 字段

或者不登录,发送一个GET请求登录页面的包,把cookie改成rememberMe=1,返回包中也存在 rememberMe=deleteMe 字段

则可判断使用了shiro框架,接下来使用工具ShiroExploit 检测是否存在shiro反序列化漏洞

当命令框可输入,代表存在漏洞

可以勾选便捷操作,反弹shell,输入攻击机的ip和端口号,并在攻击机监听端口,然后点fire,成功获取目标的shell

关于java反序列话漏洞和java反序列化漏洞有哪些的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-22,除非注明,否则均为首码项目网原创文章,转载请注明出处。