Fastjson

使用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

是否存在不出网的Fastjson利用方式(★★★)

第一种是TemplatesImpl类加载字节码做到不出网利用,但需要开启特殊参数实战鸡肋

第二种方式是服务端存在在tomcat-dbcp.jar情况下,使用BasicDataSource配合BCEL可实现不出网RCE

谈谈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

  1. {
  2. "regex":{
  3. "$ref":"$[\blue = /\^[a-zA-Z]+(([a-zA-Z ])?[a-zA-Z]*)*$/]"
  4. },
  5. "blue":"aaaaaaaaaaaaaaaaaaaaaaaaaaaa!"
  6. }

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

  1. {
  2. "@type": "java.lang.AutoCloseable",
  3. "@type": "java.io.FileOutputStream",
  4. "file": "/tmp/nonexist",
  5. "append": "false"
  6. }

是否了解自动挖掘Fastjson利用链的方式(★★★★)

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

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

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

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