Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

Outline

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

{
    "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

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

Morty Proxy This is a proxified and sanitized view of the page, visit original site.