DVWA-XSS(全等級)


XSS,全稱Cross Site Scripting,即跨站腳本攻擊,某種意義上也是一種注入攻擊,是指攻擊者在頁面中注入惡意的腳本代碼,當受害者訪問該頁面時,惡意代碼會在其瀏覽器上執行,需要強調的是,XSS不僅僅限於JavaScript,還包括flash等其它腳本語言。根據惡意代碼是否存儲在服務器中,XSS可以分為 存儲型的XSS與 反射型的XSS。
DOM型的XSS由於 特殊性,常常被分為第三種,這是一種基於DOM樹的XSS。例如服務器端經常使用document.boby.innerHtml等函數動態生成html頁面,如果這些函數在引用某些變量時沒有進行過濾或檢查,就會產生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。
反射型(Reflected)
LOW
查看源碼,路徑如下圖

 

 可以看出沒有任何過濾,直接將用戶提交的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)
函數刪除字符串中的反斜杠。
 
可以看到,對輸入並沒有做XSS方面的過濾與檢查,且存儲在數據庫中,因此這里存在明顯的存儲型XSS漏洞。
我們可以輸入<script>標簽來試圖測試漏洞,然后點擊Sign Guestbook
在Message一欄中輸入 <script>alert(1)</script>   Name隨意

 

 既然是存儲型那就有他自己的特點,當我們點開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)>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM