vlambda博客
学习文章列表

CSRF攻击详解 - 常见的Web攻击方法

目录


  • CSRF攻击简介

    • 什么是CSRF攻击?

    • CSRF攻击原理

    • CSRF攻击可以做什么?

  • CSRF攻击实操

  • CSRF攻击防御方法




CSRF攻击简介


1、什么是CSRF攻击?


CSRF全称  跨站请求伪造Cr oss- Site Request Forger y),也被称为:one click attack/session riding,缩写为:CSRF/XSRF,跟XSS攻击一样,存在巨大的危害性。

2、CSRF攻击原理



  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码登录网站A

  2. 网站A验证用户信息通过后,网站A产生Cookie信息并返回给浏览器,此时用户C登录网站A成功,可以正常发送请求到网站A

  3. 用户未退出网站A之前,在同一浏览器中,打开一个新的页面访问网站B

  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方网站A

  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息来验证用户C的权限,因为此次请求中的Cookie信息对于网站A来说是已经授权成功的,所以网站A处理该请求,导致来自网站B的恶意代码被成功执行


CSRF攻击其实就是源于WEB应用的隐藏式Cookie和Session身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是经过用户发送的!


3、CSRF攻击可以做什么?


CSRF攻击中的攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等,造成的问题包括:个人隐私泄露以及财产安全。



CSRF攻击实操

1,针对GET请求的CSRF攻击处理

如果在网站A中的接口使用的是GET请求,那么我们可以直接在网站B的页面中植入如下恶意代码,即可在网站B中来请求网站A中任意的API接口。

<img src="http://www.website-a.com/userInfo.php?id=1" />
2,针对POST请求的CSRF攻击的处理

如果在网站A中的接口使用的是POST请求,那么我们可以直接在网站B的页面中植入如下恶意代码,即可在网站B中来请求网站A中任意的API接口

<html><head></head>
<body onload="start_attack()"> <iframe name="start_attack" display="none">        <form method="POST" name="attack_form" action="http://www.website-a.com/userInfo.php">        <input type="hidden" name="id" value="1">      <input type="hidden" name="name" value="wang">     </form> </iframe></body>
<script type="text/javascript"> function start_attack(){ iframe = document.frames["start_attack"]; iframe.document.Submit("attack_form"); }</script>
</html>



CSRF攻击防御方法

1、Cookie Hashing:所有表单页面中都包含同一个伪随机值,以认证这确实是用户发送的请求。


该方法还有一个缺点是难以保证 token(伪随机值) 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。


2、验证码:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,以保证数据请求来自于网站自身。


3、One-Time Tokens:所有表单页面中都包含一个不同的伪随机值,以认证这确实是用户发送的请求。



即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。



然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于Ajax方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。