您好,登錄后才能下訂單哦!
本篇文章為大家展示了在XML中怎樣測試Fastjson反序列化,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
??在實際業務開發中,經常會對xml或者json類型的請求數據進行解析。例如微信掃碼支付的功能,按照微信開發文檔與支付平臺進行數據交互就需要使用XML格式的數據。針對XML傳輸的數據,最容易想到的就是XXE攻擊了。通過XXE的利用,可以達到以下的目的:
敏感信息泄漏(使用file協議讀取敏感文件、列目錄)
遞歸調用造成拒絕服務攻擊
SSRF
在php開啟expect拓展的前提下可能會導致遠程代碼執行
……
??在一定條件下是可以達到RCE的效果的,但是遠不及任意文件上傳和反序列化等漏洞那么粗暴。以下是記一次內部安全測試中的相關過程。
??目標主要的交互方式是以Content-Type: application/xml;charset=UTF-8
的方式進行請求的,主要以xml的方式進行數據傳輸。最先想到的就是通過引入外部實體的方式進行XXE的檢測。但是比較可惜禁用了。
??另尋出路,看看有沒有類似上傳的功能點,比較幸運的是在文件操作功能處找到了任意文件下載的缺陷,這里嘗試下載相關代碼進行審計,看看有沒有別的突破口。下載源碼的過程可以參考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或者其他類型了,這里搭建了一個環境進行驗證:
??綜上,現在目標系統應該引入了兩個消息轉換器:
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傳輸:
??轉換成json格式傳輸同樣可以解析:
??此時嘗試轉換成json格式,結合dnslog進行反序列化測試:
??dnslog成功接收到記錄:
??把結果告訴給同事,剩下的就是解決目標系統的gadget或者不出網的問題了,下班:
??綜上,在測試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反序列化,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。