IE是怎麼處理metasteam的編碼的&&那100+個xss

cnbird發表於2011-02-14

IE是怎麼處理meta steam的編碼的  && 那100+個xss


【起源】

最近hei***放言在各個大網站都存在100+個xss。這是的確存在的,問題出在IE處理meta steam的編碼策略上。

 

【原理】

IE是怎麼處理meta steam的呢?我舉個demo來說明:

 

[a.php]

<script src=”js.php”  charset=”gbk”  type=”text/javascript” ></script>

 

[js.php]

header:Content-Type: text/html; charset=big5

+/v8
alert(“+ADs-“);

 

解釋步驟:

1. IE渲染a.php時,遇到載入 <script src=”js.php” 的請求,此時IE為js.php定義的編碼是default:unicode。

2. IE解釋charset=”gbk”屬性時,js.php的編碼從default:unicode轉為gbk。

3. IE讀取js.php,遇到http頭“Content-Type: text/html; charset=big5”時,js.php的編碼從gbk轉為big5。

4. IE獲得js.php輸出的正文後,檢查頭幾個位元組是fffe還是+/v*——如果是fffe,編碼轉換為unicode;如果是+/v*,編碼轉化為utf-7。

5. 如果該steam是由 <link>標籤載入的css文件,就檢測@charset標記——如果有,則轉化為@charset對應的編碼。

(經測試,在IE8下使用http頭指定charset後,第4步不會再轉化編碼。大家自己測試吧)

 

 

【導致的問題】

1.文字儲存xss

http://hitn.bdimg.com/linx2008/css/item/8e4c24973277cc6d54fb9668.css

 

+/v8

body {

xxx: expressi+AG8AbgAoA– (window.x==123456)?1:(x=123456) );

}

(開啟hi.baidu.com/linx2008/home,然後輸入javascript:alert(x);)在heig**blog上也有demo

 

2.json的”callback”引數(100+個xss的源頭)

http://apps.hi.baidu.com/dashan/data/status?asyn=1&callback=【utf-7頭】【utf-7資料流】……

 

【解決方案】

 

 方法1:對於json的場景,設定header:Content-Type: “json”

 

方法2:不要讓正文輸出的第一個符號是”+”。

eg:在資料輸出的正文前加個空格or換回;或者過濾”+”開頭的引數輸出。


相關文章