fastjson 1.2.68 绕过autotype(有限制)
fastJson
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
环境
fastjson 1.2.68
Jdk 1.8.202
漏洞原理
设置@type的类首先能够在mapping中取出,在利用设置期望类,指定@type需要反序列化的类,就能够存入mapping中并实例化。
POC
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class poc {
public static void main(String[] args) {
String comment = "{\"x\":{\"@type\":\"java.lang.Exception\",\"@type\":\"org.openqa.selenium.WebDriverException\"},\"content\":{\"$ref\":\"$x.systemInformation\"}}";
JSONObject jsonObject = JSON.parseObject(comment);
System.out.printf(jsonObject.getString("content"));
}
}
第一个@type 会检测checkautotype,如果直接使用org.openqa.selenium.WebDriverException
会触发cheOutType 退出,那就需要绕过checkautoType,作者绕过就是使用了expectClass,设定第一个@type 为java.lang.Exception
1.白名单里的类
2.开启了 autotype
3.使用了 JSONType 注解
4.指定了期望类(expectClass)
5.缓存 mapping 中的类
漏洞分析
fastjson遇到@type
会进行反序列化,但是首先会经过一个checkAutoType检测,当置为java.lang.Exception
时,能够从mapping中直接选中,继续返回class
利用java.lang.Exception
绕过checkAutoType后,会进行一次反序列化构造.
java.lang.Exception
满足Throwable
子类,生成deserializer
之后进入反序列化org.openqa.selenium.WebDriverException
经过scanSymbol 得到key 值为@type
,满足JSON.DEFAULT_TYPE_KEY.equals(key)
进入if 语句中.
通过lexer.stringVal()
截取json拿到字符串org.openqa.selenium.WebDriverException
跟进checkAutoType
方法,如果第二个参数设置了期望对象.expectClassFlag会置为true,这对后续绕过checkAutoType检查很重要
需要注意,依然会对org.openqa.selenium.WebDriverException
进行黑名单检测
接着会将org.openqa.selenium.WebDriverException
装载进内存中
最后直接看含有return 代码块中,这里由于设置了期望类,且该类为Throwable子类,能够成功返回该类。所以可以利用的类被限制在Throwable子类下.
继续执行,经过com/alibaba/fastjson/parser/deserializer/ThrowableDeserializer.java第115行createException
跟进该方法,这里对org.openqa.selenium.WebDriverException
进行实例化
最后就会输出systemInformation结果,\"content\":{\"$ref\":\"$x.systemInformation\"}
利用$ref
去引用@type
生成的实例方法,就能够调用getSystemInformation方法.
关于SET方法调用
由于org.openqa.selenium.WebDriverException
该类中没有set方法.如果能够找到Exction类中存在set方法.最后会在com/alibaba/fastjson/parser/deserializer/ThrowableDeserializer.java第149行调用.目前还没找到异常类set方法危险调用,先鸽
参考链接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!