match (source:Method{IS_SERIALIZABLE:TRUE}) match (sink:Method{NAME0:"org.apache.commons.collections.Transformer#transform"}) CALL apoc.algo.allSimplePaths(source, sink, "CALL>|ALIAS>", 1) yield path WHERENONE( n IN nodes(path) WHERE n.CLASSNAME IN [ "org.apache.commons.collections.functors.InstantiateTransformer", "org.apache.commons.collections.functors.InvokerTransformer", "org.apache.commons.collections.functors.ChainedTransformer", "org.apache.commons.collections4.functors.InstantiateTransformer", "org.apache.commons.collections4.functors.InvokerTransformer" ] ) return path
剩下的几个都不满足要求,我们需要的是常见的方法,比如get。稍微看几个。
这里用transform调transform,LazyMap被ban的情况下可以用。
跟上面一样,也是调transform
TransformingComparator
新找到的,能够通过compare触发,可惜不能反序列化,所以没用:
transform->newInstance
这里挖掘transform->newInstance
InstantiateTransformer
这是最经典的,就是CC链官方的。
FactoryTransformer
tabby挖掘
通过tabby挖掘:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
match (source:Method{IS_SERIALIZABLE:TRUE,NAME:"transform"}) match (sink:Method{NAME:"newInstance",IS_SINK:TRUE}) call tabby.beta.findPath(source, ">", sink, 4, false) yield path WHERENONE( n IN nodes(path) WHERE n.CLASSNAME IN [ "org.apache.commons.collections.functors.InstantiateTransformer", "org.apache.commons.collections.functors.InvokerTransformer", "org.apache.commons.collections.functors.ChainedTransformer", "org.apache.commons.collections4.functors.InstantiateTransformer", "org.apache.commons.collections4.functors.InvokerTransformer" ] or n.CLASSNAME =~ "org.apache.commons.collections4.*" ) return path
其实跟InstantiateTransformer差不多。
当然,用apoc插件查询也可以:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
match (source:Method{NAME:"transform",IS_SERIALIZABLE:TRUE}) match (sink:Method{NAME0:"java.lang.reflect.Constructor#newInstance"}) CALL apoc.algo.allSimplePaths(source, sink, "CALL>|ALIAS>", 4) yield path WHERENONE( n IN nodes(path) WHERE n.CLASSNAME IN [ "org.apache.commons.collections.functors.InstantiateTransformer", "org.apache.commons.collections.functors.InvokerTransformer", "org.apache.commons.collections.functors.ChainedTransformer", "org.apache.commons.collections4.functors.InstantiateTransformer", "org.apache.commons.collections4.functors.InvokerTransformer" ] or n.CLASSNAME =~ "org.apache.commons.collections4.*" ) return path