• 推荐
  • 评论
  • 收藏

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

2020-06-10    5608次浏览

目录

  • CSRF攻击简介
    • 什么是CSRF攻击?
    • CSRF攻击原理
    • CSRF攻击可以做什么?
  • CSRF攻击实操
  • CSRF攻击防御方法

CSRF攻击简介

1、什么是CSRF攻击?

CSRF全称 跨站请求伪造(Cross-Site Request Forgery),也被称为: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:所有表单页面中都包含一个不同的伪随机值,以认证这确实是用户发送的请求。

4、验证 HTTP Referer 字段:根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址;然而,这种方法并非万无一失。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值。如果 bank.example 网站支持 IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。
即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

5、在 HTTP 头中自定义属性并验证:这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于Ajax方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。