
文章插圖
0x00 前言#按照我個(gè)人的理解來(lái)說(shuō)其實(shí)只要能拿到Request 和Response對(duì)象即可進(jìn)行回顯的構(gòu)造,當(dāng)然這也是眾多方式的一種 。也是目前用的較多的方式 。比如在Tomcat 全局存儲(chǔ)的Request 和Response對(duì)象,進(jìn)行獲取后則可以在tomcat這個(gè)容器下進(jìn)行回顯 。而某些漏洞的方式會(huì)從漏洞的位置去尋找存儲(chǔ)Request 和Response對(duì)象的地方 。
0x01 Tomcat通用回顯#根據(jù)Litch1師傅的思路來(lái)尋找request,response對(duì)象全局存儲(chǔ)的位置基于全局儲(chǔ)存的新思路 | Tomcat的一種通用回顯方法研究
根據(jù)該文章思路得知,在Tomcat啟動(dòng)的時(shí)候會(huì)調(diào)用該位置的dorun方法
由圖可見(jiàn),調(diào)用棧會(huì)來(lái)到創(chuàng)建Http11Processor對(duì)象這一步,Http11Processor繼承AbstractProcessor類(lèi) 。而AbstractProcessor類(lèi)中可見(jiàn)有Request,Response這兩對(duì)象 。并且為final修飾的,賦值后不可被更改 。
那么此時(shí)我們只需要獲取到這個(gè)Http11Processor對(duì)象即可獲取到Request,Response 。繼續(xù)跟進(jìn)查看Http11Processor對(duì)象在哪進(jìn)行存儲(chǔ) 。
調(diào)用this.register將前面創(chuàng)建的Http11Processor對(duì)象進(jìn)行傳遞 。而后調(diào)用processor.getRequest().getRequestProcessor()獲取RequestInfo 。
調(diào)用獲取到的RequestInfo,這里為rp 。rp的setGlobalProcessor將global進(jìn)行傳遞,而setGlobalProcessor方法里面會(huì)調(diào)用global.addRequestProcessor將rp添加進(jìn)去 。
跟進(jìn)進(jìn)去發(fā)現(xiàn),processors為一個(gè)ArrayList,里面存儲(chǔ)RequestInfo類(lèi)型的數(shù)據(jù) 。
所以整體的思路下來(lái)我們需要獲取AbstractProtocol$ConnectionHandler類(lèi) -> 獲取global變量 ->RequestInfo->Request–>Response 。
再往后需要尋找存儲(chǔ)AbstractProtocol類(lèi)或繼承AbstractProtocol類(lèi)的子類(lèi) 。
這里尋找到的是Connector成員變量中為protocolHandler屬性的值,而 Http11AprProtocol類(lèi)實(shí)現(xiàn)了該接口 。
所以獲取request的處理請(qǐng)求是
Connector—>AbstractProtocol$ConnectoinHandler—>global—>RequestInfo—>Request—>Response
而在Tomcat啟動(dòng)過(guò)程紅會(huì)將Connector放入Service中 。
而現(xiàn)在獲取完成的流程是
StandardService—>Connector—>AbstractProtocol$ConnectoinHandler—>RequestGroupInfo(global)–>RequestInfo——->Request——–>Response
那么這時(shí)候如何獲取StandardService成為了問(wèn)題的一大關(guān)鍵 。
文中給出的方法是從Thread.currentThread.getContextClassLoader()里面獲取webappClassLoaderBase,再獲取上下文中的 StandardService 。
最后調(diào)用鏈為
WebappClassLoaderBase —>
ApplicationContext(getResources().getContext()) —> StandardService—>Connector—>AbstractProtocol$ConnectoinHandler—>RequestGroupInfo(global)—>RequestInfo——->Request——–>Response
package com;import org.apache.catalina.Context;import org.apache.catalina.Service;import org.apache.catalina.connector.Connector;import org.apache.catalina.core.ApplicationContext;import org.apache.catalina.core.StandardContext;import org.apache.catalina.core.StandardService;import org.apache.coyote.AbstractProtocol;import org.apache.coyote.RequestGroupInfo;import org.apache.coyote.RequestInfo;import org.apache.coyote.Response;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Modifier;import java.util.ArrayList;@WebServlet("/demoServlet")public class demoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase = (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();StandardContext standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext();try {Field context = Class.forName("org.apache.catalina.core.StandardContext").getDeclaredField("context");context.setAccessible(true);ApplicationContext ApplicationContext = (ApplicationContext)context.get(standardContext);Field service = Class.forName("org.apache.catalina.core.ApplicationContext").getDeclaredField("service");service.setAccessible(true);StandardService standardService = (StandardService)service.get(ApplicationContext);Field connectors = Class.forName("org.apache.catalina.core.StandardService").getDeclaredField("connectors");connectors.setAccessible(true);Connector[] connector = (Connector[])connectors.get(standardService);Field protocolHandler = Class.forName("org.apache.catalina.connector.Connector").getDeclaredField("protocolHandler");protocolHandler.setAccessible(true);//AbstractProtocol abstractProtocol = (AbstractProtocol)protocolHandler.get(connector[0]);Class<?>[] AbstractProtocol_list = Class.forName("org.apache.coyote.AbstractProtocol").getDeclaredClasses();for (Class<?> aClass : AbstractProtocol_list) {if (aClass.getName().length()==52){java.lang.reflect.Method getHandlerMethod = org.apache.coyote.AbstractProtocol.class.getDeclaredMethod("getHandler",null);getHandlerMethod.setAccessible(true);Field globalField = aClass.getDeclaredField("global");globalField.setAccessible(true);org.apache.coyote.RequestGroupInfo requestGroupInfo = (org.apache.coyote.RequestGroupInfo) globalField.get(getHandlerMethod.invoke(connector[0].getProtocolHandler(), null));Field processors = Class.forName("org.apache.coyote.RequestGroupInfo").getDeclaredField("processors");processors.setAccessible(true);java.util.List<RequestInfo> RequestInfo_list = (java.util.List<RequestInfo>) processors.get(requestGroupInfo);Field req = Class.forName("org.apache.coyote.RequestInfo").getDeclaredField("req");req.setAccessible(true);for (RequestInfo requestInfo : RequestInfo_list) {org.apache.coyote.Request request1 = (org.apache.coyote.Request )req.get(requestInfo);org.apache.catalina.connector.Request request2 = ( org.apache.catalina.connector.Request)request1.getNote(1);org.apache.catalina.connector.Response response2 = request2.getResponse();response2.getWriter().write("111");}}}} catch (NoSuchFieldException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}這里是借助了獲取到的Request和Response來(lái)輸出結(jié)果 。再來(lái)修改一下代碼 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- linux系統(tǒng)安裝步驟 yum安裝命令
- 電腦怎么創(chuàng)建圖片密碼? 圖片密碼怎么設(shè)置
- 360發(fā)現(xiàn)全球汽車(chē)操作系統(tǒng)多個(gè)高危漏洞:獲寶馬和系統(tǒng)商雙重致謝
- 安卓手機(jī)裝win10系統(tǒng)操作方法 win10系統(tǒng)版本哪個(gè)好
- 自動(dòng)噴水滅火系統(tǒng)由哪些部分組成
- 電腦開(kāi)不開(kāi)機(jī)怎么重裝系統(tǒng)教程 win7無(wú)法關(guān)機(jī)怎么辦
- word表格自動(dòng)換頁(yè)的技巧 word不分頁(yè)怎么設(shè)置
- 2021國(guó)內(nèi)最好用免費(fèi)建站系統(tǒng) 免費(fèi)個(gè)人網(wǎng)站空間申請(qǐng)
- windows7系統(tǒng)黑屏解決方法 win7激活工具哪個(gè)好用
- h5平臺(tái)搭建步驟 h5建站系統(tǒng)源碼
