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