1. 程式人生 > >XSS轉碼 && struts2 property標籤的bug

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('<', "&lt;");
map.put('>', "&gt;");
map.put('\'', "&#39;");
map.put('\"', "&quot;");
map.put('&', "&amp;");

   在DB層無sql注入防範的時候,甚至需要是三位一體!

   拿上面那個例子來說,使用者輸入name,DB應該儲存下面的內容

&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;

    但是很不幸,這串字元使用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進位制編碼

&#106;&#0106;&#00106;&#000106;&#0000106;           //十 進位制編碼

&#x6A;&#x06A;&#x006A;&#x0006A;&#x00006A;           //十 六進位制編碼

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="&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59"> //10進位制轉碼 如圖三
<img style="xss:expr/*XSS*/ession([code])">            //css的註釋符號 為/**/,其中的內容會被忽略

  <style>@im\port'\ja\vasc\ript:alert("XSS")';</style>            //css中忽略的符號還有“\”

~~~~~~~~~~~~~~分割~~~~~~~~~~~~~~

p.s.

1.用Jquery的text()取"&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;",會被直接讀成<script>alert('xss')</script> 。

2. 這個串如果直接使用$("#xxyy").html()輸出,會產生alert框。

3.正確的做法是使用innerHTML函式,可以避免字串中js被執行:document.getElementById("xxyy").innerHTML=

  • a99e5658-e39a-3da7-9066-8aaac95fcc7e-thumb.jpg
  • 大小: 53.1 KB
  • 95692abc-320f-3037-bac5-b12ec3b3b72c-thumb.jpg
  • 大小: 46.9 KB
  • 10a9bc33-8eac-3a58-936b-1f885d794c78-thumb.jpg
  • 大小: 5.2 KB
  • 7682f766-9100-3960-b039-6c41449c9bcf-thumb.jpg
  • 大小: 5.5 KB
  • 下載次數: 176