深圳的網(wǎng)站建設(shè)公司湖南企業(yè)競價優(yōu)化服務(wù)
文章目錄
- 1:spring actuator導(dǎo)致的信息泄露
- 1.1、Endpoint配置啟用檢測
- 1.2、信息泄露復(fù)現(xiàn)
- 1.3、防御
- 2:服務(wù)端口的合理使用
- 3:弱口令(密碼)管理
- 4:服務(wù)端攻擊
- 4.1、短信業(yè)務(wù),文件上傳等資源型接口
- 1、文件上傳下載
- 2、短信
- 4.2、SOL注入攻擊
- 4.3、敏感信息泄露
- 4.4、權(quán)限漏洞
- 5:客戶端攻擊
- 5.1、跨站腳本(XSS)攻擊
- 5.1.1、知識點(diǎn)簡介
- 5.1.2、xss攻擊防御
- 1、Spring Boot 防 Xss 代碼攻擊
- 5.2、CSRF 跨域攻擊
- 5.2.1、CORS跨域簡介
- 1、解決跨域
- 5.3、點(diǎn)擊劫持
使用springboot開發(fā)的應(yīng)用可能存在各種使用不當(dāng)導(dǎo)致的信息泄露和漏洞,在此記錄
1:spring actuator導(dǎo)致的信息泄露
使用spring actuator你可以選擇通過使用HTTP端點(diǎn)或使用JMX來管理和監(jiān)控你的應(yīng)用程序。 審計、健康和指標(biāo)收集也可以自動應(yīng)用于你的應(yīng)用程序。
使用maven依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>
1.1、Endpoint配置啟用檢測
Actuator 端點(diǎn)(endpoint)讓你可以監(jiān)控并與你的應(yīng)用程序互動。 Spring Boot包括一些內(nèi)置的端點(diǎn),并允許你添加自己的端點(diǎn)。 例如, 端點(diǎn)提供基本的應(yīng)用程序健康信息:health
比如在application.yaml中配置
# Actuator 監(jiān)控端點(diǎn)的配置項
management:endpoints:web:base-path: /actuator # Actuator 提供的 API 接口的根目錄。默認(rèn)為 /actuatorexposure:include: '*' # 需要開放的端點(diǎn)。默認(rèn)值只打開 health 和 info 兩個端點(diǎn)。通過設(shè)置 * 可以開放所有端點(diǎn)。
但是在開啟 include: ‘*’ 或者開啟heapdump之后會存在信息泄露
可用已通過訪問http://127.0.0.1:port/actuator/env
獲取程序運(yùn)行的所有的配置信息(包括application配置文件系統(tǒng)的默認(rèn)配置等)
或者直接訪問http://127.0.0.1:port/actuator/heapdump下載內(nèi)存分析文件。里面可能會泄露配置的連接數(shù)據(jù)庫的密碼,ip等信息。
1.2、信息泄露復(fù)現(xiàn)
1、開啟端點(diǎn)
management:endpoints:web:base-path: /actuator # Actuator 提供的 API 接口的根目錄。默認(rèn)為 /actuatorexposure:include: '*' # 需要開放的端點(diǎn)。默認(rèn)值只打開 health 和 info 兩個端點(diǎn)。通過設(shè)置 * 可以開放所有端點(diǎn)。
2、下載堆分析文件:http://127.0.0.1:port/actuator/heapdump
3、使用jvm堆分析工具分析JVM堆的heapdump:比如jdk自帶的JDK自帶的JVisualVM工具開源的https://github.com/wyzxxz/heapdump_tool
下載jar包后在運(yùn)行目錄下運(yùn)行:后面的heapdump就是你下載的分析文件
輸入0或者1選擇分析的模式,選0即可
后輸入passowrd就會開始查找,最終查詢的結(jié)果會打印出來同時會寫到當(dāng)前目錄下的*_output.txt文件中
里面可能存在配置的數(shù)據(jù)庫密碼等導(dǎo)致信息泄露
1.3、防御
方案1:禁用heapdump,使得無法訪問堆分析文件
exclude: ‘heapdump’
management:endpoints:web:base-path: /actuator # Actuator 提供的 API 接口的根目錄。默認(rèn)為 /actuatorexposure:include: '*' # 需要開放的端點(diǎn)。默認(rèn)值只打開 health 和 info 兩個端點(diǎn)。通過設(shè)置 * ,可以開放所有端點(diǎn)。exclude: 'heapdump' #禁用headump
此時重啟程序再訪問就訪問不到了
- 方案2:結(jié)合Spring Security限制URL訪問的規(guī)則
比如需要登錄后才能訪問等 - 方案3:加密springboot配置application.yaml中的password等機(jī)密信息
2:服務(wù)端口的合理使用
合理開通防火墻端口。
對于mysql,redis,后端的服務(wù)端口不應(yīng)該暴漏給公網(wǎng)上,只允許在內(nèi)網(wǎng)通過前端連接后臺,后臺連接數(shù)據(jù)庫。
嚴(yán)格區(qū)分生產(chǎn)和測試數(shù)據(jù)庫。有時候為了測試方便會開放測試數(shù)據(jù)庫的端口給公網(wǎng),注意區(qū)分生產(chǎn)上
3:弱口令(密碼)管理
- mysql\redis等數(shù)據(jù)庫:
對于數(shù)據(jù)庫redis必須設(shè)立密碼,對于mysql\redis\應(yīng)用的登錄入口嚴(yán)禁使用弱密碼如123456、admin123、admin\admin等常見密碼,非常容易被彩虹表破解。建議設(shè)立的復(fù)雜一些 - 后臺管理系統(tǒng)登錄 :加驗證碼、強(qiáng)密碼、手機(jī)號驗證碼等
- 服務(wù)器的root等用戶登錄密碼
比如可以使用一些密碼生成器:https://1password.com/zh-cn/password-generator密碼生成器
4:服務(wù)端攻擊
4.1、短信業(yè)務(wù),文件上傳等資源型接口
別人惡意調(diào)用短信發(fā)送接口或者文件的上傳下載。業(yè)務(wù)被消耗,下載流量持續(xù)被別人消耗,帶來的是公司錢的損失!!
后臺的相關(guān)接口除了登錄注冊等接口,肯定是需要登陸鑒權(quán)后才能訪問的,這里主要針對于一些提供給第三方使用的開放接口,直接公開就能訪問的接口需要做的鑒權(quán)!
就比如,大家應(yīng)該對微信登錄、短信接口、支付寶支付等其他第三方服務(wù)!!看下別人寫的對接文檔,接口的參數(shù)都有什么apiId, apiSecret ,MD5加密校驗
1、文件上傳下載
常見發(fā)生位置 :所有使用到上傳功能的位置。
-
用戶可自定義的頭像、背景圖片等。
-
富文本編輯器中的文件上傳功能。
防御措施
-
將上傳目錄權(quán)限設(shè)置為不可執(zhí)行。
-
嚴(yán)格判斷文件類型,使用白名單而不是黑名單(注意大小寫問題)。需要注意與Web Server相關(guān)的漏洞所造成的問題,例如Apache、IIS、Nginx 等Web服務(wù)器的文件解析漏洞。
-
使用隨機(jī)數(shù)改寫上傳后的文件名和文件路徑。
-
單獨(dú)設(shè)置文件服務(wù)器及域名。
/*** 白名單文件類型*/private static final Set<String> WHITE_FILE_TYPES = SetUtils.asSet("gif", "jpg", "svg", "png", // 圖片"eot", "woff2", "ttf", "woff", // 字體"xdb");
對于使用對象存儲的服務(wù),應(yīng)該嚴(yán)格限制上傳下載的頻率、桶的私有性,各種鑒權(quán)機(jī)制
2、短信
短信發(fā)送:比如手機(jī)號必須在數(shù)據(jù)庫
4.2、SOL注入攻擊
介紹:SOL注入攻擊是攻擊者成功的向服務(wù)器提交惡意的SQL查詢代碼,程序在接收后錯誤的將攻擊者的輸入作為查詢語句的一部分執(zhí)行,導(dǎo)致原始的查詢邏輯被改變,額外的執(zhí)行了攻擊者精心構(gòu)造的惡意代碼。
舉例:’ OR ‘1’=‘1,這是最常見的 SQL注入攻擊。當(dāng)我們輸入用戶名 admin ,然后密碼輸入’ OR ‘1’=1=‘1的時候,我們在查詢用戶名和密碼是否正確的時候,本來要執(zhí)行的是SELECT * FROM user WHERE username=’’ and password=‘’,經(jīng)過參數(shù)拼接后,會執(zhí)行 SQL語句 SELECT * FROM user WHERE username=‘’ and password=‘’ OR ‘1’=‘1’,這個時候1=1是成立,自然就跳過驗證。
防御:對進(jìn)入數(shù)據(jù)庫的特殊字符('"<>&*;等)進(jìn)行轉(zhuǎn)義處理,或編碼轉(zhuǎn)換。在應(yīng)用發(fā)布之前建議使用專業(yè)的SQL注入檢測工具(如sqlmap、SQLninja)進(jìn)行檢測,以及時修補(bǔ)被發(fā)現(xiàn)的SQL注入漏洞。避免網(wǎng)站打印出SQL錯誤信息,比如類型錯誤、字段不匹配等,容易把代碼里的SQL語句暴露出來。
4.3、敏感信息泄露
1、后臺敏感數(shù)據(jù),如用戶的郵箱、手機(jī)號、身份證
2、Web 服務(wù)器的一些敏感信息,如用戶名、密碼、源代碼、服務(wù)器信息、配置信息等。
防御:
- 敏感信息加密傳輸,后端對涉密的數(shù)據(jù)去敏感信息返回;
- 應(yīng)用程序報錯時,不對外產(chǎn)生調(diào)試信息;
- 過濾用戶提交的數(shù)據(jù)與特殊字符;
- 保證源代碼、服務(wù)器配置的安全。
4.4、權(quán)限漏洞
劃分合理的用戶,組織、菜單、按鈕間的增刪改查的權(quán)限配置
5:客戶端攻擊
5.1、跨站腳本(XSS)攻擊
5.1.1、知識點(diǎn)簡介
存在三種XSS類型,通常針對用戶的瀏覽器:
反射式XSS:應(yīng)用程序或API包括未經(jīng)驗證和未經(jīng)轉(zhuǎn)義的用戶輸入,作為HTML輸出的一部分。一個成功的攻擊可以讓攻擊者在受害者的瀏覽器中執(zhí)行任意的HTML和JavaScript。 通常,用戶將需要與指向攻擊者控制頁面的某些惡意鏈接進(jìn)行交互,例如惡意漏洞網(wǎng)站,廣告或類似內(nèi)容。
存儲式XSS:你的應(yīng)用或者API將未凈化的用戶輸入存儲下來了,并在后期在其他用戶或者管理員的頁面展示出來。 存儲型XSS一般被認(rèn)為是高?;驀?yán)重的風(fēng)險。
基于DOM的XSS:會動態(tài)的將攻擊者可控的內(nèi)容加入頁面的JavaScript框架、單頁面程序或API存在這種類型的漏洞。理想的來說,你應(yīng)該避免將攻擊者可控的數(shù)據(jù)發(fā)送給不安全的JavaScriptAPI。
典型的XSS攻擊可導(dǎo)致盜取session、賬戶、繞過MFA、DIV替換、對用戶瀏覽器的攻擊(例如:惡意軟件下載、鍵盤記錄)以及其他用戶側(cè)的攻擊。
比如:在api接口傳參時param或者body中的屬性上傳一些腳本的命令等
http://192.168.1.101/xss/example2.php?name=<sCript>alert("hey!")</scRipt>
比如body的type屬性中加入腳本
POST /user
Host: api.felord.cn
{ "userId" : 1001, "username" : "felord.cn", "type" : "\<script\>alert(document.cookie)\</script\>"
}
目的:達(dá)到對入?yún)⒒蛘叱鰠?nèi)容的修改,劫持內(nèi)容達(dá)到目的
5.1.2、xss攻擊防御
防御可以在前端和后端進(jìn)行,目前主流的瀏覽器都支持很多xss攻擊的策略,包括前端對參數(shù)html的轉(zhuǎn)義判斷,后端進(jìn)行xss防御等,下面主要說后端的方案。
Xss 的防范手段
首先是過濾。對諸如(script、img、a)等標(biāo)簽進(jìn)行過濾。
其次是編碼。像一些常見的符號,如<>在輸入的時候要對其進(jìn)行轉(zhuǎn)換編碼,這樣做瀏覽器是不會對該標(biāo)簽進(jìn)行解釋執(zhí)行的,同時也不影響顯示效果。
最后是限制。通過以上的案例我們不難發(fā)現(xiàn)xss攻擊要能達(dá)成往往需要較長的字符串,因此對于一些可以預(yù)期的輸入可以通過限制長度強(qiáng)制截斷來進(jìn)行防御。
1、Spring Boot 防 Xss 代碼攻擊
從上面可以知道,Xss 攻擊是對入?yún)⒒蛘哒f輸出進(jìn)行修改,劫持內(nèi)容達(dá)到目的。因此我們需要對整個系統(tǒng)的提交進(jìn)行過濾和轉(zhuǎn)義。
spring boot 防范 XSS 攻擊可以使用過濾器,對內(nèi)容進(jìn)行轉(zhuǎn)義,過濾。
這里就采用Spring boot+Filter的方式實現(xiàn)一個Xss的全局過濾器
還可以使用編碼的形式來轉(zhuǎn)義請求參數(shù)和響應(yīng)體的字符來防止XSS攻擊。這里會用到Spring提供的工具類org.springframework.web.util.HtmlUtils
Spring boot實現(xiàn)一個Xss過濾器, 常用的有兩種方式:
第一種:
自定義過濾器
- 重寫HttpServletRequestWrapper、
重寫getHeader()、getParameter()、getParameterValues()、主要處理@param的參數(shù)的過濾 - 重寫 getInputStream()實現(xiàn)對傳統(tǒng)“鍵值對Json”傳參方式的過濾也就是@RequestBody參數(shù)
比如重寫過濾器:
import org.springframework.web.util.HtmlUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.stream.Stream;public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getHeader(String name) {String value = super.getHeader(name);return HtmlUtils.htmlEscape(value);}@Overridepublic String getParameter(String name) {String value = super.getParameter(name);return HtmlUtils.htmlEscape(value);}@Overridepublic String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);return values != null ? (String[]) Stream.of(values).map(HtmlUtils::htmlEscape).toArray() :super.getParameterValues(name);}
}
第二種:
自定義序列化器, 對MappingJackson2HttpMessageConverter 的objectMapper做設(shè)置.
重寫JsonSerializer.serialize()實現(xiàn)對出參的過濾 (PS: 數(shù)據(jù)原樣保存, 取出來的時候轉(zhuǎn)義)
重寫JsonDeserializer.deserialize()實現(xiàn)對入?yún)⒌倪^濾 (PS: 數(shù)據(jù)轉(zhuǎn)義后保存)
實現(xiàn)后在配置文件中進(jìn)行配置后測試
比如
# 防止XSS攻擊
xss:# 過濾開關(guān)enabled: true# 排除鏈接(多個用逗號分隔)excludes: /system/notice# 匹配鏈接urlPatterns: /system/*,/monitor/*,/tool/*
5.2、CSRF 跨域攻擊
跨域攻擊存在session/cookie的環(huán)境中,偽造或劫持了客戶的的cookie信息(可能包含用于的登錄信息)后偽造請求進(jìn)行了攻擊。
token可以抵抗csrf,cookie+session不行
5.2.1、CORS跨域簡介
跨域限制訪問,其實是瀏覽器的限制。理解這一點(diǎn)很重要!!!同源策略:是指協(xié)議,域名,端口都要相同,其中有一個不同都會產(chǎn)生跨域;
后端解決CORS跨域
對于 CORS的跨域請求,主要有以下幾種方式可供選擇:
- 返回新的CorsFilter (全局配置)
- 重寫WebMvcConfigurer(全局配置)
- 使用注解@CrossOrigin(局部配置)
- 手動設(shè)置響應(yīng)頭 (HttpServletResponse)(局部配置)
自定webfilter實現(xiàn)跨域
注意:
CorFilter、 WebMvConfigurer、@CrossOrigin需要SpringMVC 4.2以上版本才支持,對應(yīng)springBoot 1.3版本以上
如果使用了局部跨域是會覆蓋全局跨域的規(guī)則,所以可以通過@CrossOrigin 注解來進(jìn)行細(xì)粒度更高的跨域資源控制。
其實無論哪種方案,最終目的都是修改響應(yīng)頭,向響應(yīng)頭中添加瀏覽器所要求的數(shù)據(jù),進(jìn)而實現(xiàn)跨域
所有解決跨域問題,不外乎就是解決瀏覽器攔截問題,要么前端設(shè)置請求頭,要么后端設(shè)置請求頭,無論誰設(shè)置請求頭,瀏覽器只要放行即可
1、解決跨域
創(chuàng)建CorsFilter注冊到springboot
/*** 創(chuàng)建 CorsFilter Bean,解決跨域問題*/@Beanpublic FilterRegistrationBean<CorsFilter> corsFilterBean() {// 創(chuàng)建 CorsConfiguration 對象CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.addAllowedOriginPattern("*"); // 設(shè)置訪問源地址config.addAllowedHeader("*"); // 設(shè)置訪問源請求頭config.addAllowedMethod("*"); // 設(shè)置訪問源請求方法// 創(chuàng)建 UrlBasedCorsConfigurationSource 對象UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config); // 對接口配置跨域設(shè)置return createFilterBean(new CorsFilter(source), WebFilterOrderEnum.CORS_FILTER);}
配置springboot security
@Beanprotected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {// 登出httpSecurity// 開啟跨域.cors().and();}
5.3、點(diǎn)擊劫持
偽造頁面的按鈕,通過覆蓋現(xiàn)有的頁面內(nèi)容等方式誘導(dǎo)用戶點(diǎn)擊,是前端的攻擊