javascript
【web安全】Spring boot heapdump获取敏感信息
一、概述
微服務(wù)是目前較為熱門的技術(shù),Spring boot 是 Spring 的一套快速配置腳手架,可以基于Spring boot 快速開發(fā)單個(gè)微服務(wù),微服務(wù)的特點(diǎn)決定了功能模塊分布式部署,在不同的機(jī)器上相互通過服務(wù)調(diào)用進(jìn)行交互,業(yè)務(wù)流會(huì)經(jīng)過多個(gè)微服務(wù)的處理和傳遞。
? 多個(gè)微服務(wù)下,微服務(wù)的監(jiān)控顯得尤為重要。Actuator組件為Spring Boot提供對應(yīng)用系統(tǒng)的監(jiān)控和管理的集成功能,可以查看應(yīng)用配置的詳細(xì)信息,例如自動(dòng)化配置信息、創(chuàng)建的Spring beans信息、系統(tǒng)環(huán)境變量的配置信以及Web請求的詳細(xì)信息等。
? 如果Actuator使用不當(dāng)或者一些不經(jīng)意的疏忽,可能造成信息泄露等嚴(yán)重的安全隱患。/heapdump作為Actuator組件最為危險(xiǎn)的Web接口,如Actuator配置不當(dāng),攻擊者可無鑒權(quán)獲取heapdump堆轉(zhuǎn)儲(chǔ)文件,分析heapdump堆轉(zhuǎn)儲(chǔ)文件進(jìn)一步獲取敏感信息。
? Actuator 用來對應(yīng)用系統(tǒng)進(jìn)行自省和監(jiān)控的功能模塊,其提供的執(zhí)行器端點(diǎn)分為兩類:
? 1.原生端點(diǎn)
? 2.用戶自定義擴(kuò)展端點(diǎn)
原生端點(diǎn)主要有:
| GET | /dump | 獲取當(dāng)前應(yīng)用的所有線程dump情況。當(dāng)出現(xiàn)內(nèi)存占用過高等情況下,可以幫助分析線程的使用情況,幫助定位問題。 |
| GET | /heapdump | 堆轉(zhuǎn)儲(chǔ)文件 |
| GET | /env | 獲取全部環(huán)境屬性 |
| GET | /env/{name} | 根據(jù)名稱獲取特定的環(huán)境屬性值 |
| GET | /autoconfig | 提供了一份自動(dòng)配置報(bào)告,記錄哪些自動(dòng)配置條件通過了,哪些沒通過 |
| GET | /configprops | 描述配置屬性(包含默認(rèn)值)如何注入 Bean |
| GET | /beans | 描述應(yīng)用程序上下文里全部的 Bean,以及它們的關(guān)系 |
| GET | /health | 報(bào)告應(yīng)用程序的健康指標(biāo),這些值由 HealthIndicator 的實(shí)現(xiàn)類提供 |
| GET | /info | 獲取應(yīng)用程序的定制信息,這些信息由 info 打頭的屬性提供 |
| GET | /mappings | 描述全部的 URI 路徑,以及它們和控制器(包含 Actuator 端點(diǎn))的映射關(guān)系 |
| GET | /metrics | 報(bào)告各種應(yīng)用程序度量信息,比如內(nèi)存用量和 HTTP 請求計(jì)數(shù) |
| GET | /metrics/{name} | 報(bào)告指定名稱的應(yīng)用程序度量值 |
| POST | /shutdown | 關(guān)閉應(yīng)用程序,要求 endpoints.shutdown.enabled 設(shè)置為 true(默認(rèn)為 false) |
| GET | /trace | 提供基本的 HTTP 請求跟蹤信息(時(shí)間戳、HTTP 頭等) |
? 搭建漏洞復(fù)現(xiàn)環(huán)境:
二、Actuator配置不當(dāng)
【→所有資源關(guān)注我,私信回復(fù)“資料”獲取←】
1、網(wǎng)絡(luò)安全學(xué)習(xí)路線
2、電子書籍(白帽子)
3、安全大廠內(nèi)部視頻
4、100份src文檔
5、常見安全面試題
6、ctf大賽經(jīng)典題目解析
7、全套工具包
8、應(yīng)急響應(yīng)筆記
/heapdump作為Actuator組件最為危險(xiǎn)的Web接口之一,如Actuator配置不當(dāng),攻擊者可無鑒權(quán)獲取heapdump堆轉(zhuǎn)儲(chǔ)文件,分析heapdump堆轉(zhuǎn)儲(chǔ)文件進(jìn)一步獲取敏感信息。 其中 /dump 可獲取線程活動(dòng)的快照, /heapdump 可獲取堆轉(zhuǎn)儲(chǔ)文件。
? 堆轉(zhuǎn)儲(chǔ)文件,是Java進(jìn)程在某個(gè)時(shí)間點(diǎn)上的內(nèi)存快照。HeapDump記錄有JVM中堆內(nèi)存運(yùn)行的情況,含Java對象、類以及線程棧以及本地變量等信息。
? 通過訪問/dump 路徑,返回線程活動(dòng)的快照,可看到Springboot線程活動(dòng)中存在RMI 監(jiān)聽。
訪問/dump 路徑,效果如下圖所示:
通過訪問/heapdump 路徑,返回 hprof 堆轉(zhuǎn)儲(chǔ)文件壓縮包。在JVisualVM 打開該堆轉(zhuǎn)儲(chǔ)文件.hprof ,將泄露站點(diǎn)內(nèi)存信息,比如后臺(tái)用戶的賬號(hào)密碼。
訪問/heapdump 路徑,效果如下圖所示:
三、識(shí)別版本
Springboot heapdump端點(diǎn)存在版本差異
? Spring boot 1.x版本,默認(rèn)端點(diǎn)為/heapdump,下載的heapdump文件包含時(shí)間以及后綴hprof。
? Spring boot 2.x版本,默認(rèn)端點(diǎn)為/Actuator/heapdump,需要將下載的heapdump文件加上.hprof后綴。
四、工具選擇
分析堆轉(zhuǎn)儲(chǔ)文件工具有幾個(gè)選擇
? JVisualVM:JDK自帶工具,供開發(fā)者用于監(jiān)視,故障排除。
Eclipse MAT:Eclipse提供的一款Heap Dump分析工具,如使用Eclipse-UI內(nèi)存崩潰,可使用MAT腳本解析大容量的heap dump。
IBM Heap Analyzer:IBM公司一款分析Heap Dump信息的工具,有效的列舉堆的內(nèi)存使用狀況,幫助分析Java內(nèi)存泄漏的原因。
五、OQL查詢語言
因?yàn)槎艳D(zhuǎn)儲(chǔ)文件里面含有大量信息,要準(zhǔn)確找到我們想要的信息需要借助一些工具和一些查詢技巧。
?? ?? ? Springboot OQL 對象查詢語言是一種結(jié)構(gòu)化查詢語言,將類當(dāng)作表、對象當(dāng)作記錄行、成員變量當(dāng)作表中的字段。通過OQL可以方便快捷的查詢一些需要的信息,加快檢出需要的屬性值。
版本差異
?? ?? ? Spring boot 1.x 版本 heapdump 查詢結(jié)果存儲(chǔ)在 java.util.Hashtable$Entry 實(shí)例鍵值對中:
?? ?? ? Spring boot 2.x 版本 heapdump 查詢結(jié)果存儲(chǔ)在 java.util.LinkedHashMap$Entry 實(shí)例鍵值對中:
?? ?? ? 利用password關(guān)鍵字檢索,對應(yīng)的 oql 查詢語句
Eclipse MAT對應(yīng)查詢語句
?? ?? ? Spring boot 1.x:select * from java.util.Hashtable$Entry s WHERE (toString(s.key).contains("password"))
?? ?? ? Spring boot 2.x:select * from java.util.LinkedHashMap$Entry s WHERE (toString(s.key).contains("password"))
六、具體步驟
此次使用JDK自帶JVisualVM工具,對Heap Dump進(jìn)行分析,該工具位于<JDK_HOME>/bin/目錄。
JDK自帶工具,如下圖所示:
雙擊打開JVisualVM工具。
其主界面,如下圖所示:
?? ?? ? 通過JVisualVM加載heapdump文件,在概要欄目系統(tǒng)屬性處,可看到部分敏感信息泄露。
部分敏感信息泄露,如下圖所示:
切換至OQL控制臺(tái)標(biāo)簽,在輸入框輸入如下語句,點(diǎn)擊執(zhí)行進(jìn)行查詢。
select s.value.toString() from java.util.Hashtable$Entry s where /password/.test(s.key.toString())
查詢結(jié)果,如下圖所示:
切換至類標(biāo)簽,在下方輸入框限制檢索條件java.util.Hashtable,點(diǎn)擊結(jié)果中第一項(xiàng)java.util.Hashtable$Entry
查詢結(jié)果,如下圖所示:
切換不同的實(shí)例進(jìn)行觀察,在第411項(xiàng)實(shí)例發(fā)現(xiàn)后臺(tái)管理員密碼明文。
管理員密碼明文,效果如下圖所示:
在第409項(xiàng)實(shí)例中進(jìn)一步可看到 MySQL數(shù)據(jù)庫密碼。
查看MySQL數(shù)據(jù)庫密碼,效果如下圖所示:
在查找密碼上,可結(jié)合網(wǎng)站?/env?或?/Actuator/env?接口,檢索?關(guān)鍵詞,使用被星號(hào) 遮掩對應(yīng)的屬性名作為OQL過濾條件。
查看遮擋屬性值,效果如下圖所示:
shiroKey
?? ?? ? 如目標(biāo)網(wǎng)站使用Shiro安全框架,在過濾規(guī)則輸?org.apache.shiro.web.mgt.CookieRememberMeManager?尋找?decryptionCipherKey字段,可獲取key,進(jìn)而rememberMe反序列化利用。
七、防控措施
在代碼白盒審計(jì)時(shí),對Springboot項(xiàng)目重點(diǎn)檢測Actuator依賴,對安全依賴及配置進(jìn)行復(fù)查,建議作為漏洞檢出規(guī)則加入代碼掃描器。
?? ?? ? 在網(wǎng)絡(luò)安全風(fēng)險(xiǎn)自查中,將/heapdump?等敏感路徑加入掃描器字典。
在使用Actuator時(shí),不正確的使用或不經(jīng)意的疏忽,都會(huì)造成嚴(yán)重的信息泄露等安全隱患。安全的做法是引入security依賴,打開安全限制并進(jìn)行身份驗(yàn)證。同時(shí)設(shè)置單獨(dú)的Actuator管理端口并配置不對外網(wǎng)開放。
引入?security?依賴,打開安全限制,或禁用不需要接口,endpoints.env.enabled= false
總結(jié)
以上是生活随笔為你收集整理的【web安全】Spring boot heapdump获取敏感信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【web安全】Spring Boot e
- 下一篇: 【web安全】Spring Data C