Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

Outline

CC

谈下CC链中三个重要的Transformer(★★★)

ConstantTransformer类的transform方法直接返回传入的类对象

ChainedTransformer类中的transform方法会链式调用其中的其他Transformer.transform方法

InvokerTransformer类根据传入参数可以反射调用对应的方法

InstantiateTransformer类可以直接实例化对象

谈谈CC1(★★★)

原理是LazyMap.get可以触发构造的Transformer链的transform方法导致RCE

基于动态代理触发的LazyMap.get,在AnnotationInvocationHanlder中的invoke方法中存在Map.get操作

谈谈CC2(★★★)

该链用到TemplatesImpl类,生成恶意的字节码实例化

不过触发点是PriorityQueue类,反射设置属性TransformingComparator

PriorityQueue类是优先队列,其中包含了排序功能,该功能可以设置比较器comparator,而TransformingComparatorcompare方法会调用对象的transform方法

于是通过InvokerTransformer类的transform方法调用TemplatesImpl.newTransformer方法导致RCE

谈谈CC3(★★★)

该链用到TemplatesImpl类,生成恶意的字节码实例化

仍然是基于动态代理和LazyMap.get触发InstantiateTransformertransform方法导致RCE

谈谈CC4(★★★)

和CC2链一致,不过触发时候不是InvokerTransformer而是InstantiateTransformer类直接实例化TrAXFilter子类执行<init>/<clinit>导致RCE

谈谈CC5(★★★)

还是基于LazyMap.get触发的,不过没有动态代理,是通过BadAttributeValueExpException.readObject()调用TiedMapEntry.toString()

TiedMapEntry.getValue()中存在Map.get导致LazyMap.get触发transform

谈谈CC6(★★★)

还是基于LazyMap.get触发的,通过HashMap.readObject()到达HashMap.hash()方法,由于key是TiedMapEntry所以调用TiedMapEntry.hashCode()

hashCode方法会调用到TiedMapEntry.getValue()方法,由于Map.get导致LazyMap.get触发transform

谈谈CC7(★★★)

还是基于LazyMap.get触发的,通过Hashtable.readObject()触发了key的equals方法,跟入AbstractMap.equals方法

其中包含了Map.get导致LazyMap.get触发transform

但该链有一个坑:哈希碰撞

Morty Proxy This is a proxified and sanitized view of the page, visit original site.