java安全--反射(3)

文章发布时间:

最后更新时间:

参考文章:代码审计知识星球 phithon 的文章(java 安全漫谈 - 03.反射篇(3))

利用之一:

我们已经知道了,通过 getConstructor 可以调用构造函数,无论其是否有参,

这里用一个新的执行命令的方式 ProcessBuilder

白嫖一段代码:

1
2
3
2  Class clazz = Class.forName("java.lang.ProcessBuilder");  
((ProcessBuilder) clazz.getConstructor(List.class).newInstance(Arrays.asList("calc.exe"))).start();
//(ProcessBuilder)这个是类型转换,因为返回的是obj类型

这里,我们通过 start()直接执行了命令

如不使用强制转换,也可以使用反射来获取 start()方法

1
Class clazz = Class.forName("java.lang.ProcessBuilder");  clazz.getMethod("start").invoke(clazz.getConstructor(List.class).newInstance(Arrays.asList("calc.exe")));

p 牛说”但是,我们看到,前面这个 Payload 用到了 Java 里的强制类型转换,有时候我们利用漏洞的时候(在表达式上下文中)是没有这种语法的。”

思考了一下,可能是指在沙箱环境中无法使用强制转换

其二:

ProcessBuilder 还有一种重载方式 public ProcessBuilder(String… command)

这里我们要用到可变长参数 ,因为我们参数数量是不确定的,java 处理可变长参数的方法是编译成数组

1
2
3
public void hello(String[] names) {}
public void hello(String...names) {}
//两种一样

于是,我们传参给 getConstructor 只需要传 String[].class 这样就能用第二种重载方法