天天看點

Cross-Site Scripting: Persistent XSS 漏洞修複筆記

最近,項目工程進行 代碼安全掃描 的過程中産生了一個 XSS 相關的bug,在此記錄解決辦法,和大家分享。

一.問題描述

漏洞掃描過程中報下面缺陷資訊,大緻意思是說 由于頁面在接收參數的過程中,沒有進行參數的校驗,可能存在 參數中存在可執行代碼的漏洞。

Cross-Site Scripting: Persistent Critical

Package: /WEB-INF/views/xx

xx-web/webapp/WEB-INF/views/xxxt.jsp, line 36 (Cross-Site

Scripting: Persistent) Critical

57 @Override

Sink Details

Sink: javax.servlet.jsp.JspWriter.print()

Enclosing Method: _jspService()

File: xx-web/webapp/WEB-INF/views/xx.jsp:36

Taint Flags: DATABASE, XSS

33  <form id="policy_save" method="POST">
34  <table class="edit-table mg-t-1">
35  <input type="hidden" id="zcLsh" name="zcLsh" value="${zfzc.zcLsh}">
36  <input type="hidden" name="zcbjLsh" value="${zfzc.zcbjLsh}">
37  <input type="hidden" name="createTime" value="${zfzc.createTime}">
38  <input type="hidden" name="createUser" value="${zfzc.createUser}">
39  <input type="hidden" name="functionName" value="2"/>
           

二.産生原因

這裡引用參考的一篇文章:如何防止XSS攻擊?

三.解決辦法

解決該問題的辦法,就是要将頁面上接收的背景參數進行轉義處理,避免我們的參數中出現 “特殊字元”。這裡經過資料搜集及實踐,我們采用開源架構 OWASP Java Encoder Project,這個開源架構主要就是進行 HTML 頁面或 web 項目中 特殊字元的 轉義處理。

OWASP Java Encoder Project

首頁位址:https://www.owasp.org/index.php/OWASP_Java_Encoder_Project

githib位址:https://github.com/OWASP/owasp-java-encoder

1.先要在web工程中引入 pom 依賴

<dependency>
    <groupId>org.owasp.encoder</groupId>
    <artifactId>encoder</artifactId>
    <version>1.2.2</version>
</dependency>

<dependency>
    <groupId>org.owasp.encoder</groupId>
    <artifactId>encoder-jsp</artifactId>
    <version>1.2.2</version>
</dependency>
           

2.在 jsp 頁面中,調用相應的轉義方法

例如,文章開頭中出現 bug 提示的内容:

Cross-Site Scripting: Persistent XSS 漏洞修複筆記

我們引入以下标簽庫 ,并使用方法e.forHtml(),将 EL 表達式中的參數進行過濾

<!-- 解決XSS漏洞,引入下面lib -->
<%@taglib prefix="e" uri="https://www.owasp.org/index.php/OWASP_Java_Encoder_Project" %>
...
<input type="hidden" id="zcLsh" name="zcLsh" value="${e:forHtml(mc.zcLsh)}">
<input type="hidden" name="zcbjLsh" value="${e:forHtml(mc.zcbjLsh)}">
<input type="hidden" name="createTime" value="${e:forHtml(mc.createTime)}">
<input type="hidden" name="createUser" value="${e:forHtml(mc.createUser)}">
<input type="hidden" name="functionName" value="2"/>
<input type="hidden" name="relationId" id="relationId" value=""/>
           

再次掃描時,該 bug 未重制。

有關該問題的更多使用,大家可以參考文中的項目位址,有問題我們可以留言交流。