真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在XML中怎樣測(cè)試Fastjson反序列化

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

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)神池,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

引言

??在實(shí)際業(yè)務(wù)開發(fā)中,經(jīng)常會(huì)對(duì)xml或者json類型的請(qǐng)求數(shù)據(jù)進(jìn)行解析。例如微信掃碼支付的功能,按照微信開發(fā)文檔與支付平臺(tái)進(jìn)行數(shù)據(jù)交互就需要使用XML格式的數(shù)據(jù)。針對(duì)XML傳輸?shù)臄?shù)據(jù),最容易想到的就是XXE攻擊了。通過XXE的利用,可以達(dá)到以下的目的:

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

  • 遞歸調(diào)用造成拒絕服務(wù)攻擊

  • SSRF

  • 在php開啟expect拓展的前提下可能會(huì)導(dǎo)致遠(yuǎn)程代碼執(zhí)行

  • ……

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

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


	com.alibaba
	fastjson
	1.2.24

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

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

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

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{

@Override
public void extendMessageConverters(List> 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兩個(gè)注解,分別完成請(qǐng)求報(bào)文到對(duì)象和對(duì)象到響應(yīng)報(bào)文的轉(zhuǎn)換,底層這種靈活的消息轉(zhuǎn)換機(jī)制就是利用HttpMessageConverter來實(shí)現(xiàn)的,Spring內(nèi)置了很多消息轉(zhuǎn)換器,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等來滿足特定的需求。
?首先重寫了extendMessageConverters(List> converters)方法。將FastJsonHttpMessageConverter加入到原有的消息轉(zhuǎn)換器列表中:

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

??此時(shí)FastJsonHttpMessageConverter會(huì)在列表最后,根據(jù)消息轉(zhuǎn)換器的使用規(guī)則,會(huì)按照相關(guān)順序選擇符合要求的消息轉(zhuǎn)換器,默認(rèn)的MappingJackson2HttpMessageConverter在新加入的轉(zhuǎn)換器之前,默認(rèn)還是使用MappingJackson消息轉(zhuǎn)換器,所以這里要將移除,保證使用fastjson進(jìn)行解析:

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

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

com.fasterxml.jackson.dataformatjackson-dataformat-xml2.9.8

??查閱相關(guān)的資料,jackson轉(zhuǎn)換XML會(huì)用到j(luò)ackson-dataformat-xml組件,本質(zhì)上其實(shí)是引入了對(duì)應(yīng)的消息轉(zhuǎn)換器org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter,這樣就可以完成對(duì)應(yīng)請(qǐng)求的解析了,再結(jié)合實(shí)際需要在對(duì)應(yīng)方法的@RequestMappping注解中添加類似參數(shù):produces=“application/json;charset=UTF-8”,這樣就可以控制返回?cái)?shù)據(jù)的格式為json或者其他類型了,這里搭建了一個(gè)環(huán)境進(jìn)行驗(yàn)證:
在XML中怎樣測(cè)試Fastjson反序列化
?綜上,現(xiàn)在目標(biāo)系統(tǒng)應(yīng)該引入了兩個(gè)消息轉(zhuǎn)換器:

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

  • FastJsonHttpMessageConverter

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

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

??加載的消息轉(zhuǎn)換器列表:

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請(qǐng)求的xml數(shù)據(jù)轉(zhuǎn)換成json,進(jìn)行反序列化測(cè)試的。這里附上測(cè)試環(huán)境的實(shí)操結(jié)果:
?正常情況下是xml傳輸:
在XML中怎樣測(cè)試Fastjson反序列化
?轉(zhuǎn)換成json格式傳輸同樣可以解析:
在XML中怎樣測(cè)試Fastjson反序列化
?此時(shí)嘗試轉(zhuǎn)換成json格式,結(jié)合DNSlog進(jìn)行反序列化測(cè)試:
在XML中怎樣測(cè)試Fastjson反序列化
?dnslog成功接收到記錄:
在XML中怎樣測(cè)試Fastjson反序列化
?把結(jié)果告訴給同事,剩下的就是解決目標(biāo)系統(tǒng)的gadget或者不出網(wǎng)的問題了,下班:
在XML中怎樣測(cè)試Fastjson反序列化

??綜上,在測(cè)試XML類型傳輸?shù)恼?qǐng)求時(shí),可以嘗試進(jìn)行格式轉(zhuǎn)換,如果JSON格式同樣可以解析的話,那么可以嘗試進(jìn)行fastjson反序列化的利用嘗試,當(dāng)然jackson同理(因?yàn)閟pringboot2默認(rèn)采用的json converter是MappingJackson2HttpMessageConverter)。

??針對(duì)SpringMVC的應(yīng)用,通過配置的子元素標(biāo)簽,可以增加自定義的消息轉(zhuǎn)換器,也可以覆蓋默認(rèn)的消息轉(zhuǎn)換器,在審計(jì)時(shí)同樣可以進(jìn)行關(guān)注:

 ...
    ...
        
			
			
								text/html;charset=UTF-8
						application/json;charset=UTF-8
				
			
		

??同理,在黑盒測(cè)試時(shí),json傳輸?shù)臄?shù)據(jù)包也可以試試轉(zhuǎn)換成xml,進(jìn)行XXE的相關(guān)測(cè)試。jackson-dataformat-xml組件相關(guān)版本也是存在XXE風(fēng)險(xiǎn)的:
在XML中怎樣測(cè)試Fastjson反序列化

上述內(nèi)容就是在XML中怎樣測(cè)試Fastjson反序列化,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站名稱:在XML中怎樣測(cè)試Fastjson反序列化
網(wǎng)頁路徑:http://weahome.cn/article/pesesh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部