1.最为常见的一种Runtime
所以在审计时,其实可以关注一下这个函数,而exec("")中其实都会放接收到的参数。
Runtime.getRuntime().exec("calc");
2.ProcessBuilder执行命令
这里本人简化了,只是想告诉大家这种执行命令的方法。在审计过程中,本人会先关注到有没有使用ProcessBuilder这个类,如果有使用的话,其次会关注有没有调用到start这个方法。以上条件都存在我会寻找command()函数中的传参是否可控。如果可控的情况,则会进一步挖掘。
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("calc");
processBuilder.start();
3.反射执行命令
其实反射来玩的话,操作性就非常大了。根据自己思路可自由发挥
首先str存放的是Runtime这个类
而后通过forName获取到的Class进一步使用getMethod。最终通过invoke调用来执行命令
String str = new String(new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101});
Class<?> c = Class.forName(str);
Method m1 = c.getMethod("getRuntime");
Method m2 = c.getMethod("exec",String.class);
try {
m2.invoke(m1.invoke(null,new Object[]{}),new Object[]{"calc"});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}