java安全学习篇-3-反射

文章发布时间:

最后更新时间:

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

java安全学习篇-3-反射(3)

利用之一:

我们已经知道了,通过**getConstructor 可以调用构造函数,无论其是否有参,
这里用一个新的执行命令的方式
ProcessBuilder **
白嫖一段代码:

1
2
3
4
 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这样就能用第二种重载方法