1. 程式人生 > >一個簡單XSS攻擊示例及處理

一個簡單XSS攻擊示例及處理

最近專案被第三方工具掃描出來有一個Http head xss cross scripting漏洞,為了修復這個,順便研究了一下跨站指令碼攻擊的原理, 跨站指令碼攻擊基本上就是sql注入的html版, 核心內容就是把一段精心設計的指令碼通過網頁中的html漏洞由HTTP GET/POST傳給伺服器並執行. XSS主要有兩種,一種是注入的連結需要騙人來點選,目的是劫持使用者的cookie; 一種是該指令碼已經通過此方法注入了DB,每次有人瀏覽正常的該網站連結都會執行該指令碼,理論上java script能做的都可以做。

我這裡有個簡單示例,我的網頁中由於需求需要判斷客戶端瀏覽器來啟動對應版本的程式,所以JSP程式碼中有這一段:

<%
String sz = request.getHeader("user-agent");
...
%>
...
<script type="text/javascript">
var sz = "<%=sz%>";
...(sz.indexOf('Firefox/') != -1 ...) //此處省略,主要是判斷HTTP HEAD的資訊,取客戶瀏覽器。
</script>

 這麼一段簡單的程式碼,就有漏洞。 我這裡通過chrome正常獲取的http head的頭是這樣的:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36

所以var sz ="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36" 

 但客戶端可以通過修改HTTP HEAD中由瀏覽器響應的正常屬性達到注入目的。通過分析頁面原始碼,可以構造一個字串 ";alert(document.cookie);"



 最終頁面程式碼就變成了:

<script type="text/javascript">
sz = "";alert(document.cookie);""
...
</script>

注入目的達成,如果有人點選了這個連結,可以進一步用指令碼將使用者的cookie傳送給外網的其他伺服器,劫持cookie。

解決的方法也比較簡單,就是對使用者傳來的任何資訊進行輸入檢查,如編碼。 可以採用JDK的URLEncoder或apache commons的StringEscapeUtils 使script程式碼不能逃離我們限定的範圍。我這裡就是這樣處理,將

request.getHeader("user-agent")

改成

URLEncoder.encode(request.getHeader("user-agent"))

最終就算html注入進來,結果也變成了:

sz = "%22%3Balert%28document.cookie%29%3B%22";

該指令碼無法成為可執行指令碼。

本文出自 “祝坤榮” 部落格,請務必保留此出處