DOM型的XSS由於 其特殊性,常常被分為第三種,這是一種基於DOM樹的XSS。例如服務器端經常使用document.boby.innerHtml等函數動態生成html頁面,如果這些函數在引用某些變量時沒有進行過濾或檢查,就會產生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。

可以看出沒有任何過濾,直接將用戶提交的GET參數name輸出到頁面,我們可以輸入payload。
先利用alert測試是否存在XSS,如果有彈窗彈出,說明有XSS漏洞:
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<script>alert(1)</script>

Medium
依舊是查看源碼
這里對輸入進行了過濾,使用str_replace函數將輸入中的<script>刪除,這種防護機制是可以被輕松繞過的。
1.雙寫繞過
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<sc<script>ript>alert(1)</script>
大小寫混合繞過
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<ScriPT>alert(1)</script>
High
查看代碼,看看進行了什么過濾
可以看到,High級別的代碼同樣使用黑名單過濾輸入,preg_replace() 函數用於正則表達式的搜索和替換,這使得雙寫繞過、大小寫混淆繞過(正則表達式中i表示不區分大小寫)不再有效。
雖然無法使用<script>標簽注入XSS代碼,但是可以通過img、body等標簽的事件或者iframe等標簽的src注入惡意的js代碼。
Img標簽:
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<img src=1 onerror=alert(1)>
iframe標簽
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<iframe onload=alert(1)>
Impossible
查看代碼
可以看到,Impossible級別的代碼使用htmlspecialchars函數把預定義的字符&、”、 ’、<、>轉換為 HTML 實體,防止瀏覽器將其作為HTML元素。
存儲型(Stored)
Low
存儲型xss與反射型xss的區別在於存儲型會將用戶輸入的數據存入服務器,在用戶下一次點擊時便會觸發,由於其隱蔽性較高,所以危害也普遍大於反射型xss。
查看源代碼
trim(string,charlist)
函數移除字符串兩側的空白字符或其他預定義字符,預定義字符包括、\t、\n、\x0B、\r以及空格,可選參數charlist支持添加額外需要刪除的字符。
mysql_real_escape_string(string,connection)
函數會對字符串中的特殊符號(\x00,\n,\r,\,‘,“,\x1a)進行轉義。
stripslashes(string)
函數刪除字符串中的反斜杠。

既然是存儲型那就有他自己的特點,當我們點開DVWA里其他的頁面然后再回到當前頁面時,它就會出現彈窗,這是和反射性不一樣的地方,它存儲住了數據,可以看到存儲記錄

Message文本框有XSS漏洞,那我們試一試Name,發現Name這里限制了字符數量,十個字符
所以我們抓個包,用Burp Suite截取DVWA發送的數據包,修改其中的Name的字符數據,從而繞過這個字符的限制。
注意:我們得把數據都清空,點擊Clear Guestbook 。這是一個存儲型XSS,不清空的話我們無法判斷執行的是原來是數據還是新的語句。
在Name和Message里面都輸入任意內容,這時在Message里面我們也不能輸入<script>標簽,然后設置代理,開始抓包
我們在最后一行txtName這里更換為<script>標簽語句 <script>alert(1)</script>,然后點擊Forward
這就說明Name文本框也可以檢測XSS漏洞。
Medium
調節難度,清空數據,查看代碼
相關函數說明
strip_tags() 函數:
剝去字符串中的HTML、XML以及PHP的標簽,但允許使用<b>標簽。
addslashes() 函數:
返回在預定義字符(單引號、雙引號、反斜杠、NULL)之前添加反斜杠的字符串。
可以看到,由於對message參數使用了htmlspecialchars函數進行編碼,因此無法再通過message參數注入XSS代碼,但是對於name參數,只是簡單過濾了<script>字符串,仍然存在存儲型的XSS。
方法一:雙寫繞過
使用BurpSuite抓包改name參數為<sc<script>ript>alert(/xss/)</script>
方法二: 大小寫混合
<ScriPt>alert(/xss/)</script>
High
查看代碼
可以看到,message參數使用了htmlspecialchars函數進行編碼,我們還是無法再通過message參數注入XSS代碼,至於Name,這里使用正則表達式過濾了<script>標簽,但是卻忽略了img、iframe等其它危險的標簽,因此name參數依舊存在存儲型XSS。所以我們使用其他標簽來抓包,在Name中進行注入。
Img標簽
<img src=1 onerror=alert(1)>
iframe標簽
<iframe onload=alert(1)>