Java過濾器如何解決存儲型xss攻擊問題
Java過濾器解決存儲型xss攻擊
XSS攻擊場景
攻擊者可以通過構造URL注入JavaScript、VBScript、ActiveX、HTML或者Flash的手段,利用跨站腳本漏洞欺騙用戶,收集Cookie等相關數(shù)據(jù)并冒充其他用戶。
通過精心構造的惡意代碼,可以讓訪問者訪問非法網(wǎng)站或下載惡意木馬,如果再結合其他攻擊手段(如社會工程學、提權等),甚至可以獲取系統(tǒng)的管理權限。
舉例說明
例如:
在項目看板里待材料初審存儲下面代碼,點擊A項目會彈出框
Payload: <iframe οnlοad=alert("xss");></iframe>
例如:
全部階段結果標準-存儲下面代碼,點擊20200927測試-2
Payload: <textarea οnfοcus=alert("xss"); autofocus>
解決方案
找到項目已有的filter過濾器,在過濾HttpServletRequest參數(shù)時,進行參數(shù)的處理,使用轉義,將 < 轉義為 & lt , > 轉義為 & gt
public PaasHttpRequestWrapper(HttpServletRequest request) {
super(request);
StringBuilder stringBuilder = new StringBuilder();
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
if (inputStream != null) {
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
char[] charBuffer = new char[CHAR_BUFFER_LENGTH];
int bytesRead;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, BUFFER_START_POSITION, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
} else {
stringBuilder.append("");
}
body = stringBuilder.toString();
// 解決xss攻擊問題
if (body.contains("<")) {
body = body.replace("<", "<");
}
if (body.contains(">")) {
body = body.replace(">", ">");
}
initParameterMap();
}
XSS攻擊及解決方案
什么是XSS攻擊?
XSS攻擊使用Javascript腳本注入進行攻擊
XSS攻擊常出現(xiàn)在提交表單中,如博客的評論區(qū)等,用戶可以通過提交評論:<script>alert("你的網(wǎng)站太垃圾了!")</script>,那么只要訪問該頁面的用戶都會彈窗,當然,這可能是為了娛樂娛樂,不要小看XSS攻擊,有些人利用XSS攻擊竊取用戶名密碼,調(diào)用黑客的工程,將用戶名和密碼發(fā)送過去,也可以偽裝成釣魚網(wǎng)站。
例如在表單中注入: <script>location.href='http://www.xxx.com'</script> 那么頁面會跳轉到xxx.com
還可以根據(jù)js獲取本地瀏覽器的cookie信息,根據(jù)cookie信息完全可以模擬用戶。
注意:谷歌瀏覽器 已經(jīng)防止了XSS攻擊,為了演示效果,最好使用火狐瀏覽器。
那么該如何防止XSS攻擊呢?
實現(xiàn)思路:
使用轉義解決。將<轉義為< >轉義為>
- ①使用過濾器,攔截所有請求,重寫request
- ②重寫獲取值的方法,將特殊代碼轉換成html
具體代碼實現(xiàn):
- XssHttpServletRequest.java
package cn.itcats;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
public class XssHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
//需要重寫構造方法
public XssHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
//需要重寫getParameter(name)方法,將value進行轉義
public String getParameter(String name) {
String value = request.getParameter(name);
System.out.println("沒有轉義之前:value="+value);
if(StringUtils.isNotBlank(value)){
//轉化為html,<script>標簽都會轉化為html格式 <script>
//工具類來自于org.apache.commons.lang3.StringEscapeUtils
value = StringEscapeUtils.escapeHtml4(value);
}
return value;
}
}- web.xml配置過濾器
<!-- 防止XSS攻擊 -->
<filter>
<filter-name>FilterXSS</filter-name>
<filter-class>cn.itcats.FilterXSS</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterXSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>- FilterXss.java
package cn.itcats;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class FilterXSS implements Filter{
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//強轉為HttpServletRequest
HttpServletRequest req = (HttpServletRequest)request;
//需要重寫request,重建一個類XssHttpServletRequest 繼承 HttpServletRequestWrapper,重寫構造和getParameter方法
XssHttpServletRequest xssHttpServletRequest = new XssHttpServletRequest(req);
//務必傳入是重寫過的request,放行
chain.doFilter(xssHttpServletRequest, response);
}
public void destroy() {
}
}注意:只要是文本框、表單等,需要提交并在頁面展示的,一般都需要做防XSS攻擊。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
了解Java虛擬機JVM的基本結構及JVM的內(nèi)存溢出方式
這篇文章主要介紹了Java虛擬機JVM的基本結構及JVM的內(nèi)存溢出方式,涉及到Java內(nèi)存分配相關方面的知識,需要的朋友可以參考下2016-01-01
SpringBoot整合jasypt實現(xiàn)重要數(shù)據(jù)加密
Jasypt是一個專注于簡化Java加密操作的開源工具,這篇文章主要為大家介紹了詳細介紹了如何使用jasypt實現(xiàn)重要數(shù)據(jù)加密,感興趣的小伙伴可以了解下2025-03-03

