CSRF攻击原理和防御手段

CSRF 全称 Cross Site Request Forgery,跨站域请求伪造。这种攻击方式相对于 XSS,SQL注入等攻击方式比较晚被发现,今天就来讲解下这种攻击方式以及避免方式。

攻击过程

  • 假设用户 A 登录银行的网站进行操作,同时也访问了攻击者预先设置好的网站。
  • A 点击了攻击者网站的某一个链接,这个链接是 http://www.bank.com/xxxx 指向银行,银行服务器会根据这个链接携带的参数会进行转账操作。
  • 银行服务器在执行转账操作之前会进行 SESSION 验证是否登录,但是由于 A 已经登录了银行网站,攻击者的链接也是 www.bank.com。所以攻击的链接就会携带 session_id 到银行服务器。
  • 由于 session_id 是正确的,所以银行会判断操作是由本人发起的,执行转账操作。

演示

根据上面的说明,我们来模拟一下攻击的过程。

www.hacker.com的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="http://<code>www.bank.com</code>/transfer.php">
<input type="hidden" name="from" value="A">
<input type="hidden" name="money" value="10000">
<input type="hidden" name="to" value="hacker">
<input type="button" onclick="submit()" value="点击抽大奖">
</form>
</body>

可以发现,www.hacker.com 的网页中包含了一个向 www.bank.com 发起的post请求。并且表单都没隐藏了,只有一个诱骗用户点击的按钮。

预防

从上面的例子 可以看到 csrf 攻击过程中黑客不能拿到 cookie,也没办法对服务器返回的内容进行解析。唯一能做的就是给服务器发送请求。通过发送请求改变服务器中的数据。上面的例子中攻击者诱导用户点击链接进行转账操作,使得银行数据库中受害者的金额发生了改变。

了解了csrf攻击的原理和目标,提出了两种防御手段

referer 验证

根据 HTTP 协议,在 http 请求头中包含一个 referer 的字段,这个字段记录了该 http 请求的原地址。通常情况下,执行转账操作的 post 请求 www.bank.com/transfer.php 应该是点击 www.bank.com 网页的按钮来触发的操作,这个时候转账请求的 referer 应该是 www.bank.com。而如果黑客要进行 csrf 攻击,只能在自己的网站 www.hacker.com 上伪造请求。伪造请求的 referer 是 www.hacker.com。所以我们通过对比 post 请求的 referer 是不是 www.bank.com 就可以判断请求是否合法。

这种方式验证比较简单,网站开发者只要在 post 请求之前检查 referer 就可以,但是由于 referer 是由浏览器提供的。虽然 http 协议有要求不能篡改 referer 的值。但是一个网站的安全性绝对不能交由其他人员来保证。

token 验证

从上面的样式可以发现,攻击者伪造了转账的表单,那么网站可以在表单中加入了一个随机的 token 来验证。token 随着其他请求数据一起被提交到服务器。服务器通过验证 token 的值来判断 post 请求是否合法。由于攻击者没有办法获取到页面信息,所以它没有办法知道 token 的值。那么伪造的表单中就没有该 token 值。服务器就可以判断出这个请求是伪造的。

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :