0X01 热部署介绍
顾名思义热部署就是在应用正在运行的时候升级软件,却不需要重新启动应用。总的来说,热部署的本质是让jvm重新加载新的class文件。程序运行时,类加载器只会加载一次Java类文件,且不能卸载,这很明显不符合热部署的需要。但是,因为类加载器是可以进行更换的,所以,我们采取的方式是自定义类加载器,在自定义的类加载器中,重写findClass方法,从而实现热部署。
在常用的中间件中都提供了相关热部署的方法,如springboot和tomcat。在springboot中主要是通过devtools实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties设置spring.thymeleaf.cache=false来实现),实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。即devtools会监听classpath下的文件变动, 并且会立即重启应用(发生在保存时机),但默认情况下,/META-INF/maven, /META-INF/resources, /resources, /static, /templates, /public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了 -个LiveReload server,当资源发生改变时,浏览器刷新)。对于tomcat来说更加智能一点,其主要有三种方式实现,其检查相关的资源变动如:
• /tomcat-7/webapps/应用名.war
• /tomcat-7/webapps/应用名
• /tomcat-7/webapps/应用名/META-INF/context.xml
• /tomcat-7/conf/Catalina/localhost/应用名.xml
• /tomcat-7/conf/context.xml
对于一个War部署的应用,会检查以下资源是否发生变动:
• /tomcat-7/webapps/应用名.war
• /tomcat-7/conf/Catalina/localhost/应用名.xml
• /tomcat-7/conf/context.xml
对于一个描述符部署的应用,会检查以下资源是否发生变动:
• /tomcat-7/conf/Catalina/localhost/应用名.xml
指定的DocBase目录
• /tomcat-7/conf/context.xml
一旦这些文件或目录发生了变化,就会触发热部署,当然热部署也是有开关的,在Host上,默认是开启的。相关文件在conf目录下中的server.xml中:
此处默认autoDeploy为true,即可实现热部署。
这里需要注意的是,对于一个目录是否发生了变化,Tomcat只判断了这个目录的修改时间是否发生了变化,所以和热加载是不冲突的,因为热加载监听的是WEB-INF/classes和WEB-INF/lib目录,而热部署监听的是应用名那一层的目录。
0X02 tomcat热部署获取shell
在渗透测试过程中经常会遇到两种情况,一种是webapps目录下经常会遇到不允许被上传文件,第二种文件夹可能会被防篡改监控,在这种情况下有两种解决思路:
1、在\conf\server.xml中的<host></host>内部添加<context/>标签:
<Context debug="0" docBase="D:\1" path="/demo" privileged="true" reloadable="true"/>
docBase:项目路径,可以使用绝对路径或相对路径,相对路径是相对于webapps
path:访问项目的路径,如:http://127.0.0.1:8080/demo
reloadable:是否自动加载新增或改变的class文件.
即如下图:
但是在此处有个缺点,修改此文件时需要重启tomcat服务器,在实战中不是很适用
2、在 \conf\Catalina\localhost中添加一个XML文件,如shell.xml,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/tmp" reloadable="true" />
这种方式服务器会使用xml文件名的名字作为path属性的名字,如我在/tmp文件夹下建立一个shell.jsp文件,可访问的路径即为:
http://localhost:8080/shell/shell.jsp
此处的优点是不需要重新启动tomcat服务器,直接上传相关文件即可,利用此方法可绕过相关渗透过程中的限制。
此时也可正常解析:
可被成功连接: