正常遇到的有关于xml攻击思路定格在dtd的利用上,有关语言类的xml攻击却很少见,本文探讨xml反序列化攻击在java上的应用。
java序列化xml实体
输出
java反序列化序列化xml实体
输出
构造xml实体
输出
**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,全部方法解析,点击步过,成功触发命令执行
例子
运行结果
//语法
new Expression((Object)Class, METHOD, ARG...).execute/getValue();
自定义对象测试
我自己环境跑不出来,按道理这是能跑的
<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>