Jenkins
Orange打法
懒得写了,总结起来就是,Jenkins有个buildDispatch方法,会在dispatch中加入各种方法解析规则,比如调用getXX(),doXX()等。 而在处理路由的时候,比如传入.com/aa/bb/cc/dd
,则会链式调用jenkins.model.Jenkins类的getAA方法,再调用返回的类/对象的getBB方法一直递归下去,而这个调用是调用的继承树中的方法,即可以调用整个继承树中符合规则的方法。
1 | http://jenkin.local/securityRealm/user/test 会从上倒下依次执行: |
而具体的get方法等的调用在请求处理的dispatch()方法中,会再调用metaClass.dispatchers中各个node封装好的NameBasedDispatcher类的dispatch方法,再调用之前build时add进去的doDispatch方法来invoke触发。
最后一个比较清晰的调用图
XStream
前置知识
主要是set会调用compareTo,map会调用hashcode,这两个在gadget中起传递作用
EventHandler方式
版本:1.4.5 - 1.4.10
Groovy的两种
- Expando中调用了call,而methodClosure的call可以rce,因此传一个methodClosure进去即可。hashcode通过map来触发。
- ConvertedClosure中的invokeCustom调用了call,和Expando一样。但是进入invoke是通过调用compareTo然后动态代理进来的。注意这里的call方法有一个String参数,因此不能processBuilder,需要runtime.exec。compareTo通过set来触发。
ImageIO
通过next这个触发点结合invoke打。不写具体的了
BCEL
通过LazyIter的next结合class.forName打。
class.forName参数可控,因此可以指定类名和类加载器。这里直接指定bcel类加载器就能打。这里也能直接打jk2.101-
注意一点bcel的加载过程一些坑,见payload。这里还要熟悉一些javaassist和classloader的原理和使用。