作者:EnsecTeam
公眾號:EnsecTeam

0x00 概述

JavaMelody是一個用來對Java應用進行監控的組件。通過該組件,用戶可以對內存、CPU、用戶session甚至SQL請求等進行監控,并且該組件提供了一個可視化界面給用戶使用。

最近,該組件被爆出一個XXE漏洞——CVE-2018-15531,由于該組件的啟動特性,攻擊者無需特定的權限即可發起攻擊。

0x01 漏洞復現

我們使用SpringBoot web來搭建基礎項目,然后將JavaMelody集成進來,在maven中配置如下:

訪問 http://127.0.0.1/monitoring 出現如下頁面表示環境搭建成功

由于這里是沒有回顯的,因此可以使用Blind XXE來讀取文件進行攻擊:

DTD文件構造如下:

在JavaMelody的默認配置下,直接發包就可以觸發該漏洞。

需要注意的是,構造回顯通道時,如果是低版本的jdk,可以直接使用gopher協議回傳。如果是高版本jdk,則不支持gopher協議,那么可以使用FTP回顯技巧來讀取多行文件。

0x02 漏洞細節

我們先來看一下官方的補丁代碼:https://github.com/javamelody/javamelody/commit/ef111822562d0b9365bd3e671a75b65bd0613353

可以看到,官方在net/bull/javamelody/PayloadNameRequestWrapper.java中新增了對XMLInputFactory配置的代碼,禁用了外部實體解析和dtd實體解析。因此,很容易判斷出這里是一個XXE漏洞。

為什么這個漏洞隨意發包即可觸發漏洞呢?這和JavaMelody啟動過程有關。在觸發該漏洞后,我們在PayloadNameRequestWrapper中下斷點:

通過調用歷史信息可以發現,請求進入了一個MonitoringFilter攔截器中。

Springboot中肯定是沒有配置這個filter的,查看jar包發現,該攔截器是通過web-fragment.xml進行的配置:

在配置項中我們可以發現這個filter默認是處理所有請求:

因此,外部請求會進入MonitoringFilter的doFilter方法,之后調用了createRequestWrapper方法:

然后來到了PayloadNameRequestWrapper-> initialize方法中:

在處理soap相關的content-type時,只關注application/soap+xml,text/xml。如果發現content-type類型滿足if條件,則調用parseSoapMethodName方法執行解析,繼續跟進該方法:

在該方法中直接調用了XMLStreamReader對XML進行了解析,并沒有對外部實體解析以及dtd解析進行限制,因此出現了XXE漏洞。

0x03 漏洞修復

該漏洞修復比較簡單,直接更新JavaMelody至1.74.0即可,或者自己寫攔截器來處理惡意請求。

當然,值得注意的是,如果泄漏了/monitoring路由,其實本身就是一個很嚴重的信息泄露漏洞。因為JavaMelody提供了非常豐富的功能,比如執行gc,殺掉線程,查看SQL請求,查看系統信息、進程,查看數據庫schema信息等。

因此,如果在生產環境部署使用了JavaMelody,那就需要自行配置基礎認證或者編寫代碼來限制其訪問權限。

0x04 參考


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/705/