长亭百川云 - 文章详情

Java XMLDecode反序列化

NEO攻防队

48

2024-07-13

Java XMLDecode反序列化

前言

正常遇到的有关于xml攻击思路定格在dtd的利用上,有关语言类的xml攻击却很少见,本文探讨xml反序列化攻击在java上的应用。

JAVA XML

序列化举例

java序列化xml实体

输出

反序列化举例

java反序列化序列化xml实体

输出

攻击方式

构造xml实体

输出

反序列化链分析

先给出完整调用栈(到Expression)

逐步分析

**1.先下断点
**

上一句断点跟入发现只做了初始化和载入input数据,如果跟入可以发现其处理xml的所有handle类型

2.进入调试后跟进

再跟进

这里可以看到调用handle下parse处理我们输入的input数据,下断点直接步进至断点处

两次步进到

发现再次调用流量handle的parse方法处理我们的传入数据

步进至

前面大部分都在对handle进行预处理,下断点,继续跟进

跟进到SAXParser主类,判断handle是否为空,这里不为空再次调用parse方法,下断点跟进

调用xmlparse的parse方法,判断不为空然后调用父类的parse方法,下断点跟进

这里又调用了xmlReader父类AbstractSAXParser的parser方法,下断点再次跟进

再次回调xmlparse的parse方法,传入输入的数据,下断点跟进

调用XML11Configuration的parse方法,下断点跟进

进入正题,调用xml读取方法,下断点跟进

跟进

跟进

关键点就在这里,XMLDocumentFragmentScannerImpl类

跟进next

上张图为循环点!

跟进next

后返回XMLDocumentFragmentScannerImpl方法

注:这里是第二次循环读取,上一次循环读取数据为版本数据,循环语段见上面的图

在scanEndElement处下断点跟进

进入DocumentHandle跟进

关键方法addArgument,该方法将标签内的值设置到StringElementHandler的value属性,紧接着在endElement方法中该值被设置到parent(VoidElementHandler)的Argument中,下断点继续跟进

跟进至所有赋值操作完成,将当前handler指向parent handler,EndElement方法结束

handler指向其父类VoidElementHandler,由于没有重写getValueObject,调用NewElementhandler的getValueObject

持续跟进一段可以发现

到这便完成了一段参数的解析, 关键类Expression,下断点

成功设置参数

到这里设置的解析成功的数据为

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

再次步进入循环点,进入下次参数设置

成功设置方法start,全部方法解析,点击步过,成功触发命令执行

反序列化利用源Expression

例子

运行结果

//语法
new Expression((Object)Class, METHOD, ARG...).execute/getValue();

自定义对象测试

我自己环境跑不出来,按道理这是能跑的

附件: EXP

<java version="1.8.0_202" class="java.beans.XMLDecoder">
<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>

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2