亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在XML中怎樣測試Fastjson反序列化

發布時間:2021-12-14 10:10:56 來源:億速云 閱讀:268 作者:柒染 欄目:網絡管理

本篇文章為大家展示了在XML中怎樣測試Fastjson反序列化,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

引言

??在實際業務開發中,經常會對xml或者json類型的請求數據進行解析。例如微信掃碼支付的功能,按照微信開發文檔與支付平臺進行數據交互就需要使用XML格式的數據。針對XML傳輸的數據,最容易想到的就是XXE攻擊了。通過XXE的利用,可以達到以下的目的:

  • 敏感信息泄漏(使用file協議讀取敏感文件、列目錄)

  • 遞歸調用造成拒絕服務攻擊

  • SSRF

  • 在php開啟expect拓展的前提下可能會導致遠程代碼執行

  • ……

??在一定條件下是可以達到RCE的效果的,但是遠不及任意文件上傳和反序列化等漏洞那么粗暴。以下是記一次內部安全測試中的相關過程。

??目標主要的交互方式是以Content-Type: application/xml;charset=UTF-8的方式進行請求的,主要以xml的方式進行數據傳輸。最先想到的就是通過引入外部實體的方式進行XXE的檢測。但是比較可惜禁用了。
在XML中怎樣測試Fastjson反序列化
??另尋出路,看看有沒有類似上傳的功能點,比較幸運的是在文件操作功能處找到了任意文件下載的缺陷,這里嘗試下載相關代碼進行審計,看看有沒有別的突破口。下載源碼的過程可以參考https://sec-in.com/article/537。
??系統是通過jar啟動部署的,基于springboot進行開發。拿到代碼后習慣性的看了一下導入的組件,引入的fastjson版本為1.2.24,還是那個熟悉的配方:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.24</version>
</dependency>

??在Spring中@RequestBody主要用來接收前端傳遞給后端的json字符串中的數據的,既然使用了fastjson依賴,那么猜測可能部分接口是存在json方式交互的。直接全局搜索@RequestBody,但是發現@RequestBody也修飾了之前文件下載的接口:

@RequestMapping("/fileOper/download")
@ResponseBody
public String getOrderDetails(@RequestBody FileOper fileOper)
{
   //......
}

??這里猜測系統可能是做了xml和json數據的互相轉化?既然使用了fastjson依賴,換一個思路先去看看fastjson是如何集成的。Springboot默認將jackson作為數據轉換的工具,而且默認也是以json格式進行處理的。找到相關的配置文件WebMvcConfig,在這通過操作HttpMessageConverter消息轉換器的方式對fastjson進行了集成:

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
				FastJsonHttpMessageConverter fjc = new FastJsonHttpMessageConverter();
        FastJsonConfig fj = new FastJsonConfig();
        fj.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
        fjc.setFastJsonConfig(fj);
        converters.add(fjc);
        for (int i = converters.size() - 1; i >= 0; i--) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                converters.remove(i);
            }
        }
    }
}

??在Springboot中,可以使用@RequestBody和@ResponseBody兩個注解,分別完成請求報文到對象和對象到響應報文的轉換,底層這種靈活的消息轉換機制就是利用HttpMessageConverter來實現的,Spring內置了很多消息轉換器,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等來滿足特定的需求。
??首先重寫了extendMessageConverters(List<HttpMessageConverter<?>> converters)方法。將FastJsonHttpMessageConverter加入到原有的消息轉換器列表中:

FastJsonHttpMessageConverter fjc = new FastJsonHttpMessageConverter();
FastJsonConfig fj = new FastJsonConfig();
fj.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
fjc.setFastJsonConfig(fj);
converters.add(fjc);

??此時FastJsonHttpMessageConverter會在列表最后,根據消息轉換器的使用規則,會按照相關順序選擇符合要求的消息轉換器,默認的MappingJackson2HttpMessageConverter在新加入的轉換器之前,默認還是使用MappingJackson消息轉換器,所以這里要將移除,保證使用fastjson進行解析:

for (int i = converters.size() - 1; i >= 0; i--) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                converters.remove(i);
            }
        }

??到這里能確認fastjson的確是引入并使用的了,至少能保證@ResponseBody注解解析時使用的就是fastjson的消息轉換器(系統response返回是json格式的)。順著上面的思路,到底是什么解析了xml請求數據呢?@RequestBody為何也對xml內容進行了解析?繼續去看代碼,在依賴導入里看到了jackson-dataformat-xml組件:

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.8</version>
</dependency>

??查閱相關的資料,jackson轉換XML會用到jackson-dataformat-xml組件,本質上其實是引入了對應的消息轉換器org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter,這樣就可以完成對應請求的解析了,再結合實際需要在對應方法的@RequestMappping注解中添加類似參數:produces=“application/json;charset=UTF-8”,這樣就可以控制返回數據的格式為json或者其他類型了,這里搭建了一個環境進行驗證:
在XML中怎樣測試Fastjson反序列化
??綜上,現在目標系統應該引入了兩個消息轉換器:

  • org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter

  • FastJsonHttpMessageConverter

??根據Spring消息轉換器的使用規則,會按照相關順序選擇符合要求的消息轉換器。猜想此時系統的request請求是可以接受xml和json格式互轉的(request請求既可以解析xml又可以解析json數據)。嘗試在自己搭建的環境里集成fastjson,在在上述基礎上輸出加載的消息轉換器,相關代碼如下:

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> messageConverter : converters) {
            System.out.println(messageConverter);
        }
    }

??加載的消息轉換器列表:

org.springframework.http.converter.ByteArrayHttpMessageConverter@c074c0c
org.springframework.http.converter.StringHttpMessageConverter@58a55449
org.springframework.http.converter.ResourceHttpMessageConverter@5949eba8
org.springframework.http.converter.ResourceRegionHttpMessageConverter@6e0ff644
org.springframework.http.converter.xml.SourceHttpMessageConverter@58dea0a5
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@2a2bb0eb
org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@3c291aad
com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter@2d0566ba

??那么也就是說可以嘗試將request請求的xml數據轉換成json,進行反序列化測試的。這里附上測試環境的實操結果:
??正常情況下是xml傳輸:
在XML中怎樣測試Fastjson反序列化
??轉換成json格式傳輸同樣可以解析:
在XML中怎樣測試Fastjson反序列化
??此時嘗試轉換成json格式,結合dnslog進行反序列化測試:
在XML中怎樣測試Fastjson反序列化
??dnslog成功接收到記錄:
在XML中怎樣測試Fastjson反序列化
??把結果告訴給同事,剩下的就是解決目標系統的gadget或者不出網的問題了,下班:
在XML中怎樣測試Fastjson反序列化

??綜上,在測試XML類型傳輸的請求時,可以嘗試進行格式轉換,如果JSON格式同樣可以解析的話,那么可以嘗試進行fastjson反序列化的利用嘗試,當然jackson同理(因為springboot2默認采用的json converter是MappingJackson2HttpMessageConverter)。

??針對SpringMVC的應用,通過配置<mvc:annotation-driven>的子元素<message-converters>標簽,可以增加自定義的消息轉換器,也可以覆蓋默認的消息轉換器,在審計時同樣可以進行關注:

<mvc:annotation-driven> <mvc:message-converters register-defaults="false">...
    ...
        <bean id="fastJsonHttpMessageConverter"
			class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
			<!-- 加入支持的媒體類型:返回contentType -->
			<property name="supportedMediaTypes">
				<list>				<value>text/html;charset=UTF-8</value>
						<value>application/json;charset=UTF-8</value>
				</list>
			</property>
		</bean></mvc:message-converters>
</mvc:annotation-driven>

??同理,在黑盒測試時,json傳輸的數據包也可以試試轉換成xml,進行XXE的相關測試。jackson-dataformat-xml組件相關版本也是存在XXE風險的:
在XML中怎樣測試Fastjson反序列化

上述內容就是在XML中怎樣測試Fastjson反序列化,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

舒城县| 县级市| 宁国市| 哈巴河县| 英山县| 龙州县| 田林县| 祥云县| 武冈市| 白河县| 英山县| 巴彦县| 日土县| 广昌县| 岳普湖县| 昂仁县| 松溪县| 通河县| 太康县| 吉木萨尔县| 乌拉特中旗| 泸溪县| 浪卡子县| 孟连| 尤溪县| 罗田县| 英德市| 延川县| 扶风县| 博客| 柯坪县| 陇南市| 方山县| 清河县| 长子县| 景宁| 小金县| 谷城县| 磐石市| 呼玛县| 崇左市|