Spring Boot XSS 攻擊過濾插件使用

XSS 是什麼

XSS(Cross Site Scripting)攻擊全稱跨站腳本攻擊,爲了避免與 CSS(Cascading Style Sheets)名詞混淆,故將跨站腳本攻擊簡稱爲 XSS,XSS 是一種常見 web 安全漏洞,它容許惡意代碼植入到提供給其它用戶使用的頁面中。java

xss 攻擊流程

簡單 xss 攻擊示例

  • 若網站某個表單沒作相關的處理,用戶提交相關惡意代碼,瀏覽器會執行相關的代碼。

解決方案

XSS 過濾說明

  • 對錶單綁定的字符串類型進行 xss 處理。
  • 對 json 字符串數據進行 xss 處理。
  • 提供路由和控制器方法級別的放行規則。

使用 mica-xss

引入一下 依賴便可git

<!--XSS 安全過濾-->
		<dependency>
			<groupId>net.dreamlu</groupId>
			<artifactId>mica-core</artifactId>
			<version>2.0.9-GA</version>
		</dependency>
		<dependency>
			<groupId>net.dreamlu</groupId>
			<artifactId>mica-xss</artifactId>
			<version>2.0.9-GA</version>
		</dependency>

測試 XSS 過濾

測試 GET 參數過濾

  • 建立目標接口,模擬 get 提交
@GetMapping("/xss")
public String xss(String params){
  return params;
}
  • 返回爲空
⋊> ~ curl --location --request GET 'http://localhost:8080/xss?params=%3Cscript%3Ealert(%27xxx%27)%3C/script%3E'

測試 POST form 參數過濾

  • 建立目標接口,模擬 post form 提交
@PostMapping("/xss")
public String xss(String params){
  return params;
}
  • 返回爲空
curl --location --request POST 'http://localhost:8080/xss' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'params=<script>alert('\''xxx'\'')</script>'

測試 POST body 參數過濾

  • 建立目標接口,模擬 post body 提交
@PostMapping("/xss")
    public String xss(@RequestBody Map<String,String> body){
        return body.get("params");
    }
  • 返回爲空
curl --location --request POST 'http://localhost:8080/xss' \
--header 'Content-Type: application/json' \
--data-raw '{
    "params":"<script>alert('\''XXX'\'')</script>"
}'

跳過某些接口過濾

能夠使用 @XssCleanIgnore 註解對方法和類級別進行忽略。web

@XssCleanIgnore
@PostMapping("/xss")
public String xss(@RequestBody Map<String,String> body){
  return body.get("params");
}

原理分析

常見實現剖析

  • 目前網上大多數的方案以下圖,新增 XssFilter 攔截用戶提交的參數,進行相關的轉義和黑名單排除,完成相關的業務邏輯。在整個過程當中最核心的是經過包裝用戶的原始請求,建立新的 requestwrapper 保證請求流在後邊的流程能夠重複讀shell

mica-xss 實現

1. 自定義 WebDataBinder 編輯器支持 form 過濾

Spring WebDataBinder 的做用是從 web request 中把 web 請求裏的parameters綁定到對應的JavaBean上,在 Controller 方法中的參數類型能夠是基本類型,也能夠是封裝後的普通 Java 類型。若這個普通的 Java 類型沒有聲明任何註解,則意味着它的每個屬性都須要到 Request 中去查找對應的請求參數,而 WebDataBinder 則能夠幫助咱們實現從 Request 中取出請求參數並綁定到 JavaBean 中。json

SpringMVC 在綁定的過程當中提供了用戶自定義編輯綁定的接口,注入便可在參數綁定 JavaBean 過程當中執行過濾。瀏覽器

2. 自定義 JsonDeserializer 反序列化支持 Json 過濾

在 Spring Boot 中默認是使用 Jackson 進行序列化和反序列化 JSON 數據的,那麼除了能夠用默認的以外,咱們也能夠編寫本身的 JsonSerializer 和 JsonDeserializer 類,來進行自定義操做。用戶提交 JSON 報文會經過 Jackson 的 JsonDeserializer 綁定到 JavaBean 中。咱們只須要自定義 JsonDeserializer 便可完成在綁定 JavaBean 中執行過濾。安全

  1. 核心過濾邏輯

    在 mica-xss 中並未採起上文所述經過本身手寫黑名單或者轉義方式的實現方案,而是直接實現 Jsoup 這個工具類。app

    jsoup 實現 WHATWG HTML5 規範,並將 HTML 解析爲與現代瀏覽器相同的 DOM。curl

    • 從 URL,文件或字符串中刮取和解析 HTML
    • 使用 DOM 遍歷或 CSS 選擇器查找和提取數據
    • 操縱 HTML 元素,屬性和文本
    • 清除用戶提交的內容以防止安全白名單,以防止 XSS 攻擊
    • 輸出整潔的 HTML

項目推薦: Spring Cloud 、Spring Security OAuth2的RBAC權限管理系統 歡迎關注xss

相關文章
相關標籤/搜索