XSS轉碼 && struts2 property標籤的bug
一。瞭解背景
下面兩張圖,比較html轉義和js的轉義。
一定要區分清楚的是,內容回寫頁面,一定要做的是JS轉義!!而不僅僅是html轉義
從上面兩張圖可以看出,js裡面需要轉義到的 單引號',反斜槓\ 均不在html轉義字元之列!(如果針對XSS的話,只要對
<
>
'
")
二。<s:property value="xx"/>的稀爛之處
1.這個標籤預設是帶了html轉義的,即完全等同於<s:property value="name" escape="true"/>
2.正確XSS防範做法,應該是後臺轉義後儲存,也就是說存到DB裡面的資料,就應該是處理過的!(這裡的轉義是html&js的綜合體
map.put('<', "<");
map.put('>', ">");
map.put('\'', "'");
map.put('\"', """);
map.put('&', "&");
在DB層無sql注入防範的時候,甚至需要是三位一體!
拿上面那個例子來說,使用者輸入name,DB應該儲存下面的內容
<script>alert('xss')</script>
但是很不幸,這串字元使用s:property直接輸出到頁面上,會因為&符號又會促發一次html escape,導致顯示問題
這裡就只能繼續噁心一把了,每個標籤寫上:<s:property value="name" escape="false"/> ,徒勞耗費鍵盤。(這種安全的內容回寫比較推薦使用${name}的ongl方式直接輸出)
三。嚴防死守
1.org.springframework.web.util.HtmlUtils, spring自帶了一個類來處理,其本質需要注意,基於Char的過濾
看看原始碼應該很容易理解
StringBuffer escaped = new StringBuffer(input.length() * 2); for (int i = 0; i < input.length(); ++i) { char character = input.charAt(i); String reference = characterEntityReferences.convertToReference(character); if (reference != null) { escaped.append(reference); } else { escaped.append(character); }
a.使用String.replace(xx)的方式是搞不定的。舉例來說,字元j的表示方式有下面15種之多:
\6A\06A\006A\0006A\00006A //java形式的16進位制編碼
jjjjj //十 進位制編碼
jjjjj //十 六進位制編碼
b.使用html的過濾方式也是99% OK的,但是像mhtml這樣的漏洞,還需要過濾%0d%0a
c.指望過濾<>,過濾scrpit串這些明文,也是靠不住的。
附件是查資料找到的文件,包括:強烈建議一睹為快
1.淺析XSS(Cross Site Script:跨站式攻擊)漏洞原理(轉)
2.Ajax hacking with XSS
介紹了諸如此類的注入方式,屬於眼界開闊篇
<img src="javascript:alert('XSS');">示例:
<img src="javascript:alert('XSS');"> //10進位制轉碼 如圖三
<img style="xss:expr/*XSS*/ession([code])"> //css的註釋符號 為/**/,其中的內容會被忽略
<style>@im\port'\ja\vasc\ript:alert("XSS")';</style> //css中忽略的符號還有“\”
~~~~~~~~~~~~~~分割~~~~~~~~~~~~~~
p.s.
1.用Jquery的text()取"<script>alert('xss')</script>",會被直接讀成<script>alert('xss')</script> 。
2. 這個串如果直接使用$("#xxyy").html()輸出,會產生alert框。
3.正確的做法是使用innerHTML函式,可以避免字串中js被執行:document.getElementById("xxyy").innerHTML=
- 下載次數: 176