0X01 熱(re)部(bu)署介紹
顧名思義(yi)熱部署(shu)(shu)就(jiu)是在應(ying)用正在運(yun)行(xing)的(de)(de)時候升級軟(ruan)件,卻不(bu)需(xu)要(yao)(yao)重新(xin)啟動應(ying)用。總的(de)(de)來說,熱部署(shu)(shu)的(de)(de)本質(zhi)是讓jvm重新(xin)加(jia)載(zai)(zai)新(xin)的(de)(de)class文(wen)件。程序(xu)運(yun)行(xing)時,類(lei)(lei)加(jia)載(zai)(zai)器(qi)只會加(jia)載(zai)(zai)一次Java類(lei)(lei)文(wen)件,且不(bu)能(neng)卸載(zai)(zai),這(zhe)很明顯不(bu)符合熱部署(shu)(shu)的(de)(de)需(xu)要(yao)(yao)。但(dan)是,因為(wei)類(lei)(lei)加(jia)載(zai)(zai)器(qi)是可以進行(xing)更換的(de)(de),所以,我們(men)采取的(de)(de)方式(shi)是自(zi)定義(yi)類(lei)(lei)加(jia)載(zai)(zai)器(qi),在自(zi)定義(yi)的(de)(de)類(lei)(lei)加(jia)載(zai)(zai)器(qi)中,重寫findClass方法,從而實現(xian)熱部署(shu)(shu)。
在常用(yong)(yong)的(de)(de)中間(jian)件中都提供了相(xiang)關(guan)熱部(bu)署的(de)(de)方(fang)法(fa),如springboot和tomcat。在springboot中主要是通過(guo)devtools實(shi)現(xian)頁面(mian)熱部(bu)署(即頁面(mian)修(xiu)改后會立(li)即生效,這個(ge)可以直接在application.properties設置spring.thymeleaf.cache=false來(lai)實(shi)現(xian)),實(shi)現(xian)類文(wen)件熱部(bu)署(類文(wen)件修(xiu)改后不(bu)會立(li)即生效),實(shi)現(xian)對(dui)屬性文(wen)件的(de)(de)熱部(bu)署。即devtools會監聽classpath下的(de)(de)文(wen)件變(bian)動(dong), 并且會立(li)即重啟應用(yong)(yong)(發生在保存(cun)時機),但(dan)(dan)默(mo)認情況下,/META-INF/maven, /META-INF/resources, /resources, /static, /templates, /public這些文(wen)件夾下的(de)(de)文(wen)件修(xiu)改不(bu)會使應用(yong)(yong)重啟,但(dan)(dan)是會重新加載(devtools內嵌了 -個(ge)LiveReload server,當資源(yuan)發生改變(bian)時,瀏覽(lan)器刷新)。對(dui)于tomcat來(lai)說更(geng)加智能一點,其主要有三種(zhong)方(fang)式實(shi)現(xian),其檢查相(xiang)關(guan)的(de)(de)資源(yuan)變(bian)動(dong)如:
• /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
一(yi)旦這些文件或目錄發生(sheng)了變化,就會(hui)觸發熱部(bu)署,當然熱部(bu)署也是有開關的,在(zai)Host上,默(mo)認是開啟的。相關文件在(zai)conf目錄下中的server.xml中:
此處默認autoDeploy為true,即可(ke)實現熱(re)部署。
這(zhe)里(li)需要注意(yi)的是(shi)(shi)(shi),對于一個目(mu)錄(lu)是(shi)(shi)(shi)否發生了變(bian)化,Tomcat只判斷了這(zhe)個目(mu)錄(lu)的修(xiu)改時(shi)間是(shi)(shi)(shi)否發生了變(bian)化,所(suo)以和熱加載是(shi)(shi)(shi)不(bu)沖突(tu)的,因為熱加載監聽(ting)的是(shi)(shi)(shi)WEB-INF/classes和WEB-INF/lib目(mu)錄(lu),而熱部署監聽(ting)的是(shi)(shi)(shi)應(ying)用名(ming)那一層的目(mu)錄(lu)。
0X02 tomcat熱部(bu)署獲取(qu)shell
在(zai)滲透測試過程中(zhong)經常會遇到(dao)兩(liang)種情況,一種是webapps目錄下(xia)經常會遇到(dao)不允許被(bei)上傳文(wen)(wen)件,第二種文(wen)(wen)件夾可能會被(bei)防(fang)篡改監(jian)控,在(zai)這種情況下(xia)有兩(liang)種解決(jue)思路:
1、在\conf\server.xml中的<host></host>內部(bu)添加<context/>標簽:
<Context debug="0" docBase="D:\1" path="/demo" privileged="true" reloadable="true"/>
docBase:項目路徑,可以使(shi)用絕對路徑或(huo)相(xiang)對路徑,相(xiang)對路徑是相(xiang)對于webapps
path:訪問(wen)項目的路徑,如(ru)://127.0.0.1:8080/demo
reloadable:是(shi)否自動加載新增或改(gai)變的class文件.
即如下圖:

但是(shi)在此(ci)處有個缺點,修(xiu)改(gai)此(ci)文件時需要重(zhong)啟(qi)tomcat服務器,在實戰中不(bu)是(shi)很適用
2、在 \conf\Catalina\localhost中添(tian)加一個XML文件,如shell.xml,其內(nei)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/tmp" reloadable="true" />
這種(zhong)方式服(fu)務器(qi)會使(shi)用(yong)xml文(wen)件(jian)(jian)名的(de)名字作為path屬性的(de)名字,如我在/tmp文(wen)件(jian)(jian)夾下建立(li)一個shell.jsp文(wen)件(jian)(jian),可(ke)訪(fang)問的(de)路(lu)徑即為:
//localhost:8080/shell/shell.jsp
此處(chu)的優點是不需要(yao)重新(xin)啟動tomcat服(fu)務器,直接(jie)上傳(chuan)相關(guan)文件即(ji)可,利用此方法(fa)可繞過(guo)相關(guan)滲透過(guo)程中的限(xian)制。
此時也(ye)可(ke)正(zheng)常解析:

可被成(cheng)功連接:
