如OWASP網站(https://www.owasp.org/index.php/Cross-site_Scripting_(XSS))所述,跨站點腳本(XSS)攻擊的變種幾乎是無限的。 在這里,我建議使用基于Servlet篩選器的解決方案來清理HTTP請求。
攻擊
讓我們看看XSS攻擊是如何表現出來的。 附件是一個過度簡化的portlet,它顯示了一個場景,該場景在論壇等基于社交和協作的系統中非常常見。 參見下面的偽序列圖。
在這里,1.有一個可用的表單,用戶可以在其中輸入帶有提交按鈕和名為“ mytext”的文本框的評論。 用戶A呈現此表單。 2.用戶A在輸入文本框中輸入一個Java腳本并提交表單(這是邪惡輸入您的應用程序的步驟)。 只是為了讓您看到問題所在; 假設用戶輸入的腳本將應用程序存儲的cookie發送到攻擊者的站點。 3.用戶B登錄到系統,他想查看用戶A提供的注釋。因此,他進入相應頁面,系統在其中呈現A提供的“ mytext”的值。4.瀏覽器呈現“ mytext”的值,即一個Java腳本,它獲取為用戶B存儲的當前站點的所有cookie,并將其發送給Attackers系統。
預防措施(總比治愈更好),我們將看到清除HTTP參數如何有助于阻止這種攻擊。 為了使這次攻擊成功,當B提供A的評論時,將向瀏覽器發送什么樣的響應? 就像是 -
<div>A's Comments</div>
<div>
<script>
<!--
This script will get all cookies and will send them to attacker's site.
-->
</script>
</div>
如您所見,這種攻擊之所以可能是因為,對于瀏覽器而言,HTML文檔是標記和可執行代碼的混合體。 混合可執行代碼和標記的能力是攻擊者可以利用的致命組合。 使用Servlet過濾器,我們可以清除所有輸入參數并刪除所有可以表示瀏覽器可執行指令的特殊字符。 這樣,沒有邪惡進入系統。 這是執行此操作的非常簡單的Servlet過濾器。 使用HttpServletRequest上的包裝器,并且在轉義后重寫方法以返回請求參數值。 為了逃避,我建議使用Apache Commons項目的StringEscapeUtils,而不要進行一些自定義編碼。
另一種方法是讓用戶輸入他們想要的任何東西,但在渲染時將<,>,&,',“轉換為其相應的字符實體代碼。 通常,這可以通過使用JSTL來完成–
<div>A's comments</div>
<div>
<c:out value="${comments}" escapeXml="true" />
</div>
當用戶可以彼此共享代碼片段時,此方法特別有用。
基于用戶與系統之間的交互,可以設計出許多其他巧妙的方式來發起XSS攻擊。 但是擁有對系統輸入的絕對控制權肯定可以再次防范此類攻擊。
參考: XSS和預防我們JCG伙伴 Advait特里維迪在CoolCode博客。
翻譯自: https://www.javacodegeeks.com/2012/08/cross-site-scripting-xss-and-prevention.html