DVWA:全等级XSS
XSS,全稱Cross Site Scripting,即跨站腳本攻擊,某種意義上也是一種注入攻擊,是指攻擊者在頁面中注入惡意的腳本代碼,當受害者訪問該頁面時,惡意代碼會在其瀏覽器上執行,需要強調的是,XSS不僅僅限于JavaScript,還包括flash等其它腳本語言。根據惡意代碼是否存儲在服務器中,XSS可以分為存儲型(Stored)的XSS與反射型(Reflected)的XSS。
DOM型的XSS由于其特殊性,常常被分為第三種,這是一種基于DOM樹的XSS。例如服務器端經常使用document.boby.innerHtml等函數動態生成html頁面,如果這些函數在引用某些變量時沒有進行過濾或檢查,就會產生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。
簡單來說,XSS就通常指黑客通過HTML注入纂改了網頁,插入惡意腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。
反射型XSS(Reflected)
把難度調至Low等級,然后進入XSS(Reflected),顯示如下界面:
我們打開代碼,看一下邏輯和限制(路徑如下圖所示):
可以看到,代碼直接引用了name參數,并沒有任何的過濾與檢查,存在明顯的XSS漏洞。
先利用alert測試是否存在XSS,如果有彈窗彈出,說明有XSS漏洞:
http://192.168.1.1/DVWA-master/vulnerabilities/xss_r/?name=<script>alert(1)</script>
Medium
我們先把難度調節到中等,然后進入XSSReflected頁面:
然后我們照例用alert進行測試,發現并沒有彈窗出現:
http://192.168.1.1/DVWA-master/vulnerabilities/xss_r/?name=<script>alert(1)</script>
那么真的沒有XSS漏洞嗎,顯然不是,否則這個等級就失去了意義,我們查看代碼一探究竟:
這里對輸入進行了過濾,使用str_replace函數將輸入中的<script>刪除,這種防護機制是可以被輕松繞過的。雙寫,大小寫混合,都可以輕松繞過它:
雙寫繞過
http://192.168.1.1/DVWA-master/vulnerabilities/xss_r/?name=<sc<script>ript>alert(1)</script>
大小寫混合繞過
http://192.168.1.1/DVWA-master/vulnerabilities/xss_r/?name=<ScRipt>alert(1)</script>
High
我們嘗試用alert來看看會不會出現彈窗,結果發現并沒有:
http://192.168.1.1/DVWA-master/vulnerabilities/xss_r/?name=<script>alert(1)</script>
所以我們來打開代碼。看看他進行了哪些防御,結果發現,High級別的代碼同樣使用黑名單過濾輸入,preg_replace()函數用于正則表達式的搜索和替換,這使得雙寫繞過、大小寫混淆繞過(正則表達式中i表示不區分大小寫)不再有效:
那么<script>標簽確實是被限制住了,我們沒有辦法繼續利用這個標簽檢測XSS漏洞。所以這里可以更換別的標簽,雖然無法使用<script>標簽注入XSS代碼,但是可以通過img、body等標簽的事件或者iframe等標簽的src注入惡意的js代碼:
Img標簽:
http://192.168.1.1/DVWA-master/vulnerabilities/xss_r/?name=<img src=1 onerror=alert(1)>
iframe標簽
http://192.168.1.1/DVWA-master/vulnerabilities/xss_r/?name=<iframe onload=alert(1)>
存儲型XSS(Stored)
Low
大致上等同于反射型,但是攻擊效果遠遠強于反射型。
我們打開源代碼(路徑如下):
我們呢發現用了很多新的函數:
trim(string,charlist)函數:
函數移除字符串兩側的空白字符或其他預定義字符,預定義字符包括、 、
、x0B、以及空格,可選參數charlist支持添加額外需要刪除的字符。
mysql_real_escape_string(string,connection)函數:
函數會對字符串中的特殊符號(x00,
,,,‘,“,x1a)進行轉義。
stripslashes(string)函數:
函數刪除字符串中的反斜杠。
這些函數中并沒有對輸入做XSS方面的過濾與檢查,且存儲在數據庫中,因此這里存在明顯的存儲型XSS漏洞。我們可以果斷輸入<script>標簽來試圖測試漏洞,然后點擊Sign Guestbook(這里我們是在Message文本框中輸入,Name隨便輸入一個):
<script>alert(1)</script>
當我們點到別的頁面又回來的時候,發現竟然重新彈出了彈窗,或者再次點擊Sign Guestbook,也是一樣,跟反射型XSS不同,反射型XSS想彈出彈窗,每一次都需要再寫一次<script>標簽,而存儲型XSS會把文本框的內容存儲下來,這個時候我們應該明白了,為什么叫做存儲型XSS而不是其他名字。我們在文本框下方也可以看到存儲的記錄:
既然Message文本框有XSS漏洞,那么能不能通過Name文本框檢測呢,我們復制代碼進去,結果發現,竟然限制了字符位數,只有十個字符:
<script>alert(1)</script>
所以我們來做個代理,用Burp Suite截取DVWA發送的數據包,修改其中的Name的字符數據,從而繞過這個字符的限制。在此之前我們得把數據都清空,前面也提到了,這是一個存儲型XSS,不清空的話我們無法判斷執行的是原來是數據還是新的語句,簡而言之,就是控制變量。
在Name和Message里面都輸入任意內容,這時在Message里面我們也不能輸入<script>標簽,原因當然也是控制變量,如下圖所示,我們在標記的屬于Name的部分,更換為<script>標簽的語句:
我們更換后點擊Forward,返回DVWA頁面,發現有返回的對話框:
由于我們前面控制變量,所以這就說明Name文本框也可以檢測XSS漏洞。
Medium
還是一樣,調節難度,注意的是,點擊Clear Guestbook清理存儲記錄:
雖然知道不大行,但是還是用<script>標簽試一下,然后發現,果然沒有彈窗,只是多出一條記錄:
那么我們就查看代碼,看看有什么防御:
相關函數說明
strip_tags()函數:
剝去字符串中的HTML、XML以及PHP的標簽,但允許使用<b>標簽。
addslashes()函數:
返回在預定義字符(單引號、雙引號、反斜杠、NULL)之前添加反斜杠的字符串。
尤其可以看到的是,對message參數使用了htmlspecialchars函數進行編碼,因此我們無法再通過message參數注入XSS代碼,但是對于name參數,只是簡單過濾了<script>字符串,仍然存在存儲型的XSS。所以當然,我們放棄在Message中注入,通過Burp Suite抓包在Name中構造<script>,步驟和注意事項在Low等級已經有詳細內容,我們有雙寫和大小寫混合兩種方法可供選擇,這里只放出語句和截圖(注意清除記錄),其余不再贅述:
雙寫:
<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(233)>
iframe標簽
<iframe onload=alert(1)>
總結
以上是生活随笔為你收集整理的DVWA:全等级XSS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国联通无线路由器如何设置联通方形无线路
- 下一篇: 如何设置路由器实现跨网段文件共享两个路由