Fastjson原理和利用

2年前 (2022-04-14) 三千院翼 学习笔记 0评论 已收录 833℃

fastjson反序列化原理

在请求包里面中发送恶意的json格式payload,漏洞在处理json对象的时候,没有对@type字段进行过滤,从而导致攻击者可以传入恶意的TemplatesImpl类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes生成java实例,这就达到fastjson通过字段传入一个类,再通过这个类被生成时执行构造函数。

fastjson不出网如何利用?

1.将命令执行结果写入到静态资源文件里,如html、js等,然后通过http访问就可以直接看到结果
2.通过dnslog进行数据外带
3.直接将命令执行结果回显到请求Poc的HTTP响应中
4.注入内存马
5.使用反序列化链直接本地反序列化

BasicDataSource`(tomcat-dbcp:7.x, tomcat-dbcp:9.x, commons-dbcp:1.4)
TemplatesImpl、BCEL链利用、c3p0利用

使用JSON.parse()JSON.parseObject()的不同

前者会在JSON字符串中解析字符串获取@type指定的类,后者则会直接使用参数中的class,并且对应类中所有gettersetter都会被调用

什么情况下反序列化过程会反射调用getter

符合getter规范的情况且不存在setter

如果不存在settergetter方法可以反射设置值吗

需要服务端开启Feature.SupportNonPublicFiel参数,实战无用

Fastjson在反序列化byte[]类型的属性时会做什么事情

将会在反序列化时候进行base64编码

常见的几种Payload

首先是最常见的JdbcRowSetImpl利用JDNI注入方式触发,需要出网

利用TemplatesImpl类比较鸡肋,需要服务端开启特殊参数

不出网的利用方式有一种BasicDataSource配合BCEL可实现RCE

另外某个版本之后支持$ref的功能,也可以构造一些Payload

1.2.47版本之前各个小版本的绕过

首先是利用解析问题可以加括号或大写L绕过低版本,高版本利用了哈希黑名单,之所以要哈希是因为防止黑客进行分析。但黑名单还是被破解了,有师傅找到可以绕过了类。在1.2.47版本中利用缓存绕过

Fastjson探测

使用dnslog做检测是最常见的方式,利用java.net.Inet[4][6]Addressjava.net.InetSocketAddressjava.net.URL类,之所以使用这三个因为不在黑名单中,可以直接检测

除了这种方式,还可以自行实现虚假的JNDI Server作为反连平台,用JdbcRowSetImpl这样的Payload来触发

如果不能出网,可以结合不出网的利用方式和中间件的回显手段,执行无害命令检测,或利用报错回显

1.2.68版本的绕过

1.2.68之前的66和67可以利用JNDI相关类,比如ShiroJndiObjectFactoryignite项目的类

1.2.68中有一个期望类属性,实现了期望接口的类可以被反序列化

利用类必须是expectClass类的子类或实现类,并且不在黑名单中,即可直接绕过AutoType检测,例如常见的AutoCloseable

这样的Payload通常第一个@typeAutoCloseable等合法类,第二个@type是恶意类,后续参数是恶意类需要的参数

Fastjson的WAF Bypass手段

Fastjson默认会去除键值外的空格、\b、\n、\r、\f等字符,同时还会自动将键值进行unicode与十六进制解码

例如针对@type的绕过:\u0040\u0074\u0079\u0070\u0065

加入特殊字符的绕过:{\n"@type":"com.sun.rowset.JdbcRowSetImpl"...}

除了RCE还能有什么利用

信息泄露或者ReDoS,参考下方Payload

{
    "regex":{
        "$ref":"$[\blue = /\^[a###zA###Z]+(([a###zA###Z ])?[a###zA###Z]*)*$/]"
    },
    "blue":"aaaaaaaaaaaaaaaaaaaaaaaaaaaa!"
}

还可以实现写文件,例如以下这个针对1.2.68写文件的Payload

{
  "@type": "java.lang.AutoCloseable",
  "@type": "java.io.FileOutputStream",
  "file": "/tmp/nonexist",
  "append": "false"
}

自动挖掘Fastjson利用链的方式

利用链主要集中在gettersetter方法中,如果getter或者setter的方法中存在一些危险操作比如JNDI查询,如果参数可控就可以导致JNDI注入

简单来说,直接搜对应项目中JNDIlookup方法,可以基于ASM解压分析Jar包,这种半自动结合人工审核的方式其实很好用(之前挖到过几个)

进一步来说,全自动的方式可以使用codeqlgadget###inspector工具来做,主要是加入了污点传递,分析getter/setter参数如何传递到lookup

关闭全自动分析原理,一般面试官不会问太深入,因为可能涉及到静态分析相关的技术,普通安服崽的面试不会太过深入,如果是实验室可能需要再学习一下

博主
               

一个网安苦手,VtbMusic开发组成员|兽耳科技官方群管理组成员|珈百璃字幕组成员|夜樱诺娅字幕组成员|铃音_Official鸽组成员|米孝子|信安摸鱼生

相关推荐

有任何意见请评价。