You are on page 1of 47

CSRF 基础与进阶

1.CSRF 简介

2.CSRF 实例讲解

3.CSRF 真实案例

4.CSRF 进阶

5.探求本质—— CSRF 深入解析

6.CSRF 防御

7.CSRF 与 XSS

8.总结
CSRF 简介
CSRF 简介

什么是 CSRF ?
• CSRF ( Cross-site Request Forgery ),中文名称:跨站点请求伪
造,也被称为: One Click Attack/Session Riding ,缩写为:
CSRF/XSRF ;
• CSRF 这种攻击方式在 2000 年已经被国外的安全人员提出,但在国内
,直到 06 年才开始被关注, 08 年,国内外的多个大型社区和交互网
站分别爆出 CSRF 漏洞,如: NYTimes.com (纽约时
报)、 Metafilter (一个大型的 BLOG 网站), YouTube 和百度
Hi...... 而现在,互联网上的许多站点仍对此毫无防备,以至于安全
业界称 CSRF 为“沉睡的巨人”。
CSRF 简介

一句话概括 CSRF :

• 攻击者盗用(伪造)了受害者的身份,以受害者的名义发送恶意请求
,而这种恶意请求在服务端看起来只不过是正常请求。
CSRF 简介

CSRF 能做什么:
• 以受害者名义发送邮件,发消息,盗取受害者的账号,甚至购买商品
,虚拟货币转账,修改受害者的网络配置(比如修改路由器 DNS 、重
置路由器密码) ...... 造成的问题包括:个人隐私泄露、机密资料
泄露、用户甚至企业的财产安全;
• 一句话概括 CSRF 的危害:盗用受害者身份,受害者能做什么,攻击
者就能以受害者的身份做什么。
CSRF 简介

一张图了解 CSRF 攻击过程:

1.浏览并登录信任网站A

Web (A)
2.验证通过,在用户C处产生A的Cookie
(Trusted)
5.根据B在4的请求,浏览器带着2处产生的Cookie访问A

Browser

3.用户在没有退出A的情况下,访问危险网站B Web (B)


User C
(Hacked)
4.B要求访问第三方站点A,发出一个请求request
CSRF 简介

CSRF 攻击满足的【必要】条件:

• 用户 C 登录受信任网站 A ,并在本地生成 Cookie ;

• 在不登出 A 的情况下,访问危险网站 B 。
CSRF 实例讲解
CSRF 实例讲解

用虚拟的银行转账操作的例子演示 CSRF 的攻击过程:

• 银行网站 A ,它以 GET 请求来完成银行转账的操作,如:


http://www.mybank.com/Transfer.php?toBankId=11&money=1000
(当然真实的银行网站不会这样做);
• 危险网站 B ,它里面有一段 HTML 的代码如下:
CSRF 实例讲解

用虚拟的银行转账操作的例子演示 CSRF 的攻击过程:

• 用户 C 先登录银行网站 A ( A 网站会在浏览器本地生成 Cookie


);
• 用户 C 不关闭 A ,新开一个浏览器标签页紧接着再访问危险网站
B (网站 B 中加载的图片会向网站 A 发送一个转账请求,这个请
求带着银行网站 A 的 Cookie );
• 用户 C 的 1000 元钱在 C 不知情的情况下被转到了黑客的账户
中。
CSRF 实例讲解

为什么会这样?

• 银行网站 A 违反了 HTTP 规范,使用 GET 请求更新资源;

• 在访问危险网站 B 的之前,你已经登录了银行网站 A , A 网站在与浏


览器的会话中生成了 Cookie ;
• B 中的 <img> 以 GET 的方式请求银行网站 A (是一个转账请求,并附
带着 A 的 Cookie );
• 银行网站 A 收到请求后,认为这是一个更新资源操作(转账操作)
,所以就立刻进行转账操作。
CSRF 实例讲解

为了杜绝上面的问题,银行决定改用 POST 请求完成转账操作:

• 银行网站 A 将前端的转账 Web 表单改成如下形式:


CSRF 实例讲解

为了杜绝上面的问题,银行决定改用 POST 请求完成转账操作:

• 银行网站 A 的后端 PHP 实现,如下:


CSRF 实例讲解

而恶意网页 B ,仍然只是那一条 HTML 代码:

• 带恶意 <img> 标签的 HTML 代码:


CSRF 实例讲解

重复之前的操作过程:

• 先登录银行网站 A ;

• 不关闭网站 A ,打开新的标签页访问网页 B ;

1000 元又不翼而飞!
CSRF 实例讲解

为什么?

• 银行后台使用了 PHP 的 $_REQUEST 去获取请求的数据;

• 而 $_REQUEST 既可以获取 GET 请求的数据,也可以获取 POST 请求


的数据;
• 后台处理程序无法区分这到底是 GET 请求的数据还是 POST 请求的数
据,所以用 GET 请求的数据发到银行网站 A 的后台,数据一样被
视为正常的。
CSRF 实例讲解

怎么办?
• 在 PHP 中,可以使用 $_GET 和 $_POST 分别获取 GET 请求和
POST 请求的数据;
• 经过前面的惨痛教训,银行网站 A 决定把后端 PHP 获取数据的方式也
强制改为 $_POST ,如下:
CSRF 实例讲解

然而恶意网页 B ,也随着 A 的改动而改了成用 POST 发送数据的方式:


CSRF 实例讲解

结果?

• 如果用户 C 还是按照前面的流程依次访问 A 和 B ,结果仍会是账户莫


名其妙地少 1000 元!
CSRF 真实案例
CSRF 真实案例

昵图网某处 CSRF 可设置用户支付密码:


CSRF 真实案例

昵图网某处 CSRF 可设置用户支付密码:


CSRF 真实案例

暴走漫画刷金币 CSRF 漏洞:


CSRF 真实案例

暴走漫画刷金币 CSRF 漏洞:


CSRF 真实案例

PHPSHE 关键位置 CSRF 增加管理员账号:


CSRF 真实案例

PHPSHE 关键位置 CSRF 增加管理员账号:


CSRF 真实案例

TP-Link 家用路由器 CSRF 致 DNS 劫持:


CSRF 进阶
CSRF 进阶

浏览器的 Cookie 策略:


• 前面的例子之所以成功,是因为浏览器访问恶意网页 B 时,在 B 的域
内向银行网站 A 发送请求,附带了 A 的 Cookie ;
• 浏览器持有的 Cookie 分两种:“ Session Cookie” (临时 Cookie
)和“第三方 Cookie” (本地 Cookie );
• “ 第三方 Cookie” 被服务器设置了 Expire 时间,到了指定时间才会
失效;
• “Session Cookie” 没有指定失效时间,浏览器关闭就会失效。
CSRF 进阶

浏览器的 Cookie 策略:


• 不同的浏览器对待这两种不同的 Cookie ,有不同的安全策略:
- IE6 、 IE7 、 IE8 、 Safari 处于安全考虑,默认禁止在 <img> 、 <iframe>
、 <script> 、 <link> 等标签中发送第三方 Cookie ;

- Firefox2 、 Firefox3 、 Opera 、 Chrome 、 Android 等浏览器默认允许在


以上标签中发送第三方 Cookie ;

- 但上面的浏览器都会发送 SessionCookie 。
CSRF 进阶

P3P 头:

• W3C 制定的一项关于用户隐私的标准;

• 无论任何浏览器类型, P3P 头可以指定允许在危险标签中发送“第三


方 Cookie”
CSRF 进阶

CSRF 蠕虫:

• CSRF 攻击方式的终极形式:自我复制、迅速传播;

• 2008 年百度 Hi 的 CSRF 蠕虫:

• 漏洞出现在百度用户中心发送短消息功能中:

• 只需要指定 sn 参数为发送消息的用户, co 参数为消息内容,就


可以成功发送短消息。
CSRF 进阶

CSRF 蠕虫:
• 如何成为蠕虫?

• 此处配合了另外一个漏洞:百度空间的好友功能数据是使用 json 格
式实现的,此接口没有做任何的安全限制,只需将 un 参数设定为
任意用户账号,就可以获得指定用户的百度好友数据,如下
CSRF 进阶

CSRF 蠕虫:
• 蠕虫思路:

• 将上面两个漏洞结合起来:让一个百度用户查看恶意页面后,将会给
他的所有好友发送一条短消息,消息中包含一张图片,图片地址再次
指向 CSRF 漏洞利用的恶意页面,这些好友再次将同样的消息发送给
他们所有好友
• 蠕虫得以呈指数方式传播。
CSRF 深入解析
CSRF 深入解析

本质是什么?

• 由上面的原理简介和案例解析可知: CSRF 攻击是源于 WEB 的隐式身


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

• 再深入一点,其本质原因是重要操作的所有参数都可以被攻击者猜测
到。
CSRF 防御
CSRF 防御

验证码
• 验证码被认为是对抗 CSRF 攻击【最简洁有效】的防御方法;
CSRF 防御

Referer Check (请求来源检查)


• 检查 HTTP 请求头部的 Referer 字段,该字段标明请求来源 URL
CSRF 防御

Anti CSRF Token


• CSRF 的本质是:重要操作的所有参数都可以被攻击者猜测到。
• 最容易想到的,【防猜测】的措施?

加密!

http://host/path/zhuanzhang?to=blank_id&count=1000

http://host/path/zhuanzhang?to=md5(salt+blank_id)&count=1000
CSRF 防御

Anti CSRF Token


• 【防猜测】的改进方案:

随机 Token (令牌)

http://host/path/zhuanzhang?to=blank_id&count=1000

http://host/path/zhuanzhang?
to=blank_id&count=1000&token=[random(seed)]
CSRF 防御

Anti CSRF Token 注意事项

• 真随机

• Token 泄露:直接在 URL 后面附带 Token ,可能会造成 Token


泄露
• XSS 攻击也可以获取到 Token 的值
CSRF 与 XSS
CSRF 与 XSS

CSRF 的防御方案仅用于对抗 CSRF 攻击


• 但如果网站还同时存在 XSS 漏洞,则 CSRF 的防御措施就形同虚设;

• XSS 可以模拟浏览器执行大部分操作,在 XSS 攻击下,攻击者可以


请求页面后,读出页面内容里的 Token ,然后再构造一个合法请求
,这个过程称为—— XSRF ;
• XSS 带来的问题,应由 XSS 的防御方案予以解决。

• 安全防御的体系相辅相成,缺一不可。
总结
总结

• 概述 CSRF 攻击基本原理

• 示例演示 CSRF 攻击

• 展示真实的 CSRF 攻击案例

• CSRF 高级攻击技术

• CSRF 防御

You might also like