# 19\. 存儲型 XSS 入門 [什么都沒過濾的情況]
> 來源:[19\. 存儲型 XSS 入門 \[什么都沒過濾的情況\]](http://www.wooyun.org/bugs/wooyun-2010-016750)
## 簡要描述
存儲型和反射型相比,只是多了輸入存儲、輸出取出的過程。簡單點說: 反射型是:輸入--輸出;
存儲型是:輸入--進入數據庫\*--取出數據庫--輸出。 這樣一來,大家應該注意到以下差別:
反射型是:絕大部分情況下,輸入在哪里,輸出就在哪里。
存儲型是:輸入在 A 處進入數據庫, 而輸出則可能出現在其它任何用到數據的地方。
反射型是:輸入大部分位于地址欄或來自 DOM 的某些屬性,也會偶爾有數據在請求中(POST 類型) 存儲型是:輸入大部分來自 POST/GET 請求,常見于一些保存操作中。
因而我們找存儲型的時候,從一個地方輸入數據,需要檢測很多輸出的點,從而可能會在很多點發現存儲型 XSS。 至于如何根據輸出來構建存儲型 XSS 的代碼,和反射型沒有任何區別,都是看輸出的上下文來進行。 從程序員過濾代碼的角度來講,我們給之后的教程走向分個類:
1\. 數據需要過濾,但是未過濾。導致 XSS。 比如:昵稱、個人資料。
2\. 業務需求使得數據只能部分過濾,但過濾規則不完善,被繞過后導致 XSS。 比如:日志、郵件及其它富文本應用。 本節先看一個最基本的情況,該過濾,但是什么都沒過濾的情況。
(數據庫:不一定是像 mysql 那樣的數據庫,只要是能存儲數據的都算。)
## 詳細說明
1\. 找存儲型的時候,需要有一顆多疑的心,一雙善于發現的眼睛。我們來看看實例!
2\. 某一天,某一群,與某一妹子有以下對話。

3\. 過了一會,就來了這么一條消息,原來是手機 QQ 錄了發上來的。

4\. 這個時候,我們就會想,這個發上來的頁面會不會有 XSS 呢?
5\. 我們來看看頁面的結構。

6\. 很多新手在找 XSS 的時候,都是拿著`<script>alert(1)</script>`或者其它到處測試,很盲目不是嗎?
一定要記住本節最開頭的話,存儲型 XSS,輸出的位置不一定出現在輸入的位置。
7\. 因而我們有時候需要逆向的思維,來尋找存儲型 XSS。 大概思路如下:
7.1 先找到輸出點,然后猜測此處輸出是否會被過濾。
7.2 如果覺得可能沒過濾,我們再找到這個輸出是在哪里輸入的。
7.3 接著開始測試輸入,看輸出的效果。
7.4 如果沒過濾,那么你就成功了,否則你可以放棄掉它。
8\. 拿本例來說明以上過程,
8.1 我們猜測昵稱這個輸出沒過濾。
8.2 找到輸入點,這個輸入點,就是修改 QQ 昵稱。
8.3 開始測試
通過 WEBQQ 修改昵稱如下:(方法見: WooYun: PKAV 騰訊專場 - 3\. 騰訊 QQ 客戶端某處功能頁面存儲型 XSS ) 使用 charles web proxy 攔截 WEBQQ 數據包,修改并提交。

提交成功后:

8.4 我們拿小號進入一個群,發布一條手機 QQ 的語音。看輸出效果,沒過濾,成功了吧~~


拿 xsser.me 在某群的測試效果!

登錄他人帳號:

修復方案:
昵稱處輸出過濾。
- 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]