Java XMLDecode反序列化

· 2021-07-29 11:05 · 1 阅读

原创 风潇 2021-07-29 11:05

学习Java XMLDecode反序列化笔记

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

<?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>

阅读原文

跳转微信打开