XSS(Cross-Site Scripting,跨站腳本攻擊)是一種常見的 Web 攻擊技術,攻擊者通過在 Web 頁面中插入惡意的腳本代碼,使得用戶在瀏覽頁面時執行這些腳本,從而達到攻擊的目的。通常被分為如下的三種類型。
存儲型 XSS(Stored XSS)
攻擊者將惡意腳本代碼存儲在服務器上的數據庫或文件中,當用戶訪問包含這些惡意代碼的頁面時,會執行這些代碼。
反射型 XSS(Reflected XSS)
攻擊者將惡意腳本代碼作為參數注入到URL中,當用戶點擊包含這些惡意參數的URL時,服務器端將參數反射回頁面并執行,從而觸發XSS攻擊。
DOM 型 XSS(DOM-based XSS)
攻擊者利用客戶端腳本對DOM(Document Object Model,文檔對象模型)進行操作的漏洞,通過修改頁面的DOM結構來執行惡意代碼。
SpringBoot可以通過使用過濾器或攔截器來對請求參數進行過濾和清理,防止惡意的XSS腳本注入。下面是一種通過過濾器實現防止XSS攻擊的方法。
創建一個自定義的過濾器,用于過濾請求中的參數,并清理其中的HTML標簽和特殊字符。
@WebFilter("/*")
public class XSSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作,可以留空
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
}
@Override
public void destroy() {
// 銷毀操作,可以留空
}
static class XSSRequestWrapper extends HttpServletRequestWrapper {
XSSRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (value != null) {
value = cleanXSS(value);
}
return value;
}
private String cleanXSS(String value) {
// 進行 XSS 過濾,清理 HTML 標簽和特殊字符
// 例如,可以使用正則表達式或者第三方庫進行過濾
// 這里只是簡單示例,具體過濾規則需根據實際情況自行設計
return value.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("\"", """)
.replaceAll("'", "'")
.replaceAll("&", "&");
}
}
}
在SpringBoot應用的配置類中注冊該過濾器。
@Bean
public FilterRegistrationBean<XSSFilter> xssFilterRegistration() {
FilterRegistrationBean<XSSFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new XSSFilter());
registration.addUrlPatterns("/*");
registration.setName("xssFilter");
registration.setOrder(1);
return registration;
}
上述代碼,我們創建了一個名為XSSFilter的過濾器,在doFilter方法中,對請求進行過濾,并在需要時使用XSSRequestWrapper對請求參數進行清理。清理過程中,我們簡單地將 HTML 標簽和一些特殊字符替換為相應的轉義序列,以防止惡意腳本注入。
請注意,這只是一種簡單的示例,實際場景中應根據具體情況制定更為嚴格的過濾規則。
互聯網誕生起,安全威脅就--直伴隨著網站的發展,各種Web攻擊和信息泄露也從未停止。2011年中國互聯網領域爆出兩樁比較大的安全事故,一樁是新浪微博遭XSS攻擊,另一樁是以CSDN為代表的多個網站泄露用戶密碼和個人信息。特別是后者,因為影響人群廣泛,部分受影響網站涉及用戶實體資產和交易安全,一時成為輿論焦點。
這里列舉常用的幾中攻擊方式:
一、XSS攻擊
xss攻擊即跨站點腳本攻擊( Cross Site Script), 指黑客通過篡改網頁,注入惡意HTML腳本,保存在網站的服務器,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。
XSS攻擊相對而言是一種“古老”的攻擊手段,卻又歷久彌新,不斷變化出新的攻擊花樣,許多以前認為不可能用來攻擊的漏洞也逐漸被攻擊者利用。因此XSS防攻擊也是非常復雜的。主要手段有如下兩種。
1、過濾消毒
xss攻擊者一般都是通過在請求中嵌入惡意腳本達到攻擊的目的,這些腳本是一般用戶輸入中不使用的,如果進行過濾和消毒處理,即對某些html 危險字符轉義,如“>”轉義為“>"、“<”轉義為“<” 等,就可以防止大部分攻擊。為了避免對不必要的內容錯誤轉義,如“3<5”中的“<”需要進行文本匹配后再轉義,如“<img src=”這樣的上下文中的“<" 才轉義。事實上,消毒幾乎是所有網站最必備的XSS防攻擊手段。
2、HttpOnly
最早由微軟提出,即瀏覽器禁止頁面JavaScript訪問帶有HttpOnly屬性的Cookie。
HttpOnly并不是直接對抗XSS攻擊的,而是防止XSS攻擊者竊取Cookie。對于存放敏感
信息的Cookie,如用戶認證信息等,可通過對該Cookie添加HttpOnly屬性,避免被攻擊
腳本竊取。
二、注入攻擊
注入攻擊主要有兩種形式,SQL 注入攻擊和OS注入攻擊。SQL注入攻擊的原理如下。攻擊者在HTTP請求中注入惡意SQL命令( drop table users;),服務器用請求參數構造數據庫SQL命令時,惡意SQL被一起構造,并在數據庫中執行。
SQL注入攻擊需要攻擊者對數據庫結構有所了解才能進行,攻擊者獲取數據庫表結構信息的手段有如下幾種:比如網站使用了開源的組件、錯誤提示返回數據結構信息等。常用防御方式有兩種:
1、過濾
和防XSS攻擊一樣,請求參數消毒是一種比較簡單粗暴又有效的手段。通過正則匹配,過濾請求數據中可能注入的SQL,如“ drop table" 、“ \b(?:updatelb.*?\bset|delete\b\W*?\bfrom)b"等。
2、參數綁定
使用預編譯手段,綁定參數是最好的防SQL注入方法。目前許多數據訪問層框架,如IBatis, Hibernate等,都實現SQL預編譯和參數綁定,攻擊者的惡意SQL會被當做SQL的參數,而不是SQL命令被執行。
除了SQL注入,攻擊者還根據具體應用,注入OS命令、編程語言代碼等,利用程序漏洞,達到攻擊目的。
三、CSRF攻擊
CSRF ( Cross Site Request Forgery,跨站點請求偽造),攻擊者通過跨站請求,以合法用戶的身份進行非法操作,如轉賬交易、發表評論等。CSRF的主要手法是利用跨站請求,在用戶不知情的情況下,以用戶的身份偽造請求。其核心是利用了瀏覽器Cookie或服務器Session策略,盜取用戶身份。
相應地,CSRF的防御手段主要是識別請求者身份。主要有下面幾種方法。
1、表單token
CSRF是一個偽造用戶請求的操作,所以需要構造用戶請求的所有參數才可以。表單Token通過在請求參數中增加隨機數的辦法來阻止攻擊者獲得所有請求參數:在頁面表單中增加一個隨機數作為Token,每次響應頁面的Token都不相同,從正常頁面提交的請求會包含該Token值,而偽造的請求無法獲得該值,服務器檢查請求參數中Token的值是否存在并且正確以確定請求提交者是否合法。
2、驗證碼
相對說來,驗證碼則更加簡單有效,即請求提交時,需要用戶輸入驗證碼,以避免在用戶不知情的情況下被攻擊者偽造請求。但是輸入驗證碼是一個糟糕的用戶體驗,所以請在必要時使用,如支付交易等關鍵頁面。
3、Referer check
HTTP請求頭的Referer域中記錄著請求來源,可通過檢查請求來源,驗證其是否合法。很多網站使用這個功能實現圖片防盜鏈(如果圖片訪問的頁面來源不是來自自己網站的網頁就拒絕)。
三、其他攻擊和漏洞
以上只是列舉常見的三種,還有一些其他的也常被黑客利用,比如錯誤堆棧信息直接返回敏感信息,HTML注釋有敏感信息,文件上傳只沒有限制文件類型(黑客上傳惡意腳本),路徑遍厲等
天,從開發人員的角度,說說《如何防范常見的Web攻擊》話題。
SQL注入攻擊,這個是最常聊到的話題,使用過Java的開發人員,第一個反應就是一定要使用預編譯的PrepareStatement,是吧?
什么是SQL注入攻擊
攻擊者在HTTP請求中注入惡意的SQL代碼,服務器使用參數構建數據庫SQL命令時,惡意SQL被一起構造,并在數據庫中執行。
用戶登錄,輸入用戶名 lianggzone,密碼 ‘ or ‘1’=’1 ,如果此時使用參數構造的方式,就會出現
select * from user where name = 'lianggzone' and password = '' or '1'='1'
不管用戶名和密碼是什么內容,使查詢出來的用戶列表不為空。
現在還會存在SQL注入攻擊么
這個問題在使用了預編譯的PrepareStatement后,安全性得到了很大的提高,但是真實情況下,很多同學并不重視,還是會留下漏洞的。舉個例子,看看,大家的代碼中對 sql 中 in 操作,使用了預編譯,還是仍然還是通過字符串拼接呢?
如何防范SQL注入攻擊
使用預編譯的PrepareStatement是必須的,但是一般我們會從兩個方面同時入手。
Web端
服務端
什么是XSS攻擊
跨站點腳本攻擊,指攻擊者通過篡改網頁,嵌入惡意腳本程序,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。
假設頁面上有一個表單
<input type="text" name="name" value="梁桂釗"/>
如果,用戶輸入的不是一個正常的字符串,而是
"/><script>alert("haha")</script><!-
此時,頁面變成下面的內容,在輸入框input的后面帶上了一段腳本代碼。
<input type="text" name="name" value="梁桂釗"/><script>alert("haha")</script><!-"/>
這端腳本程序只是彈出一個消息框,并不會造成什么危害,攻擊的威力取決于用戶輸入了什么樣的腳本,只要稍微修改,便可使攻擊極具攻擊性。
XSS攻擊有多可怕
蠻早之前,我曾經找了幾個網站做個測試,其實大家對XSS攻擊的防范還是不夠,都成功的注入了測試腳本。
甚至,還有攻擊者提交惡意的javascript代碼的評論信息或者反饋信息(這些信息,正常客戶端沒有做xss校驗,會存在客戶端注入問題),所有訪問者訪問該內容時,都會執行這段惡意的javascript代碼。
如何防范XSS攻擊
什么是CSRF攻擊
跨站點請求偽造,指攻擊者通過跨站請求,以合法的用戶的身份進行非法操作。可以這么理解CSRF攻擊:攻擊者盜用你的身份,以你的名義向第三方網站發送惡意請求。CRSF能做的事情包括利用你的身份發郵件,發短信,進行交易轉賬,甚至盜取賬號信息。
如何防范CSRF攻擊
什么是文件上傳漏洞
文件上傳漏洞,指的是用戶上傳一個可執行的腳本文件,并通過此腳本文件獲得了執行服務端命令的能力。
許多第三方框架、服務,都曾經被爆出文件上傳漏洞,比如很早之前的Struts2,以及富文本編輯器等等,可能被一旦被攻擊者上傳惡意代碼,有可能服務端就被人黑了。
如何防范文件上傳漏洞
一般來說,“基于URL的訪問控制”是最常見的。
垂直權限管理
訪問控制實際上是建立用戶與權限之間的對應關系,即“基于角色的訪問控制”,RBAC。不同角色的權限有高低之分。高權限角色訪問低權限角色的資源往往是被允許的,而低權限角色訪問高權限的資源往往被禁止的。在配置權限時,應當使用“最小權限原則”,并使用“默認拒絕”的策略,只對有需要的主體單獨配置”允許”的策略,這在很多時候能夠避免發生“越權訪問”。
例如,Spring Security, Apache Shiro都可以建立垂直權限管理。
水平權限管理
水平權限問題在同一個角色上,系統只驗證了訪問數據的角色,沒有對角色內的用戶做細分,由于水平權限管理是系統缺乏一個數據級的訪問控制所造成的,因此水平權限管理又可以稱之為“基于數據的訪問控制”。
舉個理解,比如我們之前的一個助手產品,客戶端用戶刪除評論功能,如果沒有做水平權限管理,即設置只有本人才可以刪除自己的評論,那么用戶通過修改評論id就可以刪除別人的評論這個就存在危險的越權操作。
這個層面,基本需要我們業務層面去處理,但是這個也是最為經常遺落的安全點。
上面列舉的幾個話題,都是我在開發過程中,遇到的比較常見的Web安全話題,以及一些防范方案,需要我們在開發過程中及時規避,而不是依靠安全人員或者真正用戶,甚至惡意的攻擊者幫我們去發現問題。當然,還有很多Web安全話題,例如遠程執行漏洞、拒絕服務攻擊、Session保持攻擊等等
喜歡的小伙伴,點個關注吧!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。