zoukankan      html  css  js  c++  java
  • CSRF

    CSRF 攻击是如何产生的?

    攻击过程举例:

    当你在银行页面发起一笔转账时,这个过程其实是通过一个转账接口来完成的。

    这个接口的内容可能包括下面这些内容:

    • 接口地址:http://bank.com/transfer ;
    • HTTP 方法:POST;接口参数:
    • to(目标账户)、amount(金额)

    在转账之前,你肯定进行了一次登录。这样一来,这个转账接口就可以通过你之前存储在 Cookie 中的相关字段来完成认证了。所以,这个接口参数中不需要包含任何身份认证相关的信息。也正是因为如此,这个接口满足了 CSRF 攻击的基本条件:

    • 使用 Cookie 进行认证;
    • 参数中不包含任何隐私信息

    于是,黑客可以构造一个如下的空白网页。我们假设这个网页的地址为 hacker.com

    <html>
      <body>
        <form action="http://bank.com/transfer" method="POST">
          <input type="hidden" name="to" value="hacker" />
          <input type="hidden" name="amount" value="10000.00" />
        </form>
        <script>
          document.forms[0].submit();
        </script>
      </body>
    </html>

    在 HTML 中,<script>标签内的 JavaScript 脚本会在打开网页的时候自动执行。因此,一旦用户访问了这个 hacker.com 的页面,它就会自动提交 form 表单,向http://bank.com/transfer这个接口(假设为转账接口)发起一个 POST 请求

    其中,to 和 amount 这两个参数,代表着用户向黑客的账号转账 10000 元。只要这个用户之前登录过 bank.com,并且账户余额大于 10000 元,那么黑客就能够成功地收到这 10000 元的转账了。在这个网页中,<input>的标签带有“hidden”属性,所以这整个过程对于用户来说都是不可见的。

    通过 CSRF 攻击,黑客能做什么?

    黑客也只需要在自己的域名中,搭建一个诱导性的网页,就可以让任何访问网页的用户都遭受到 CSRF 攻击。而且,用户每天需要访问大量的网页,根本没有办法确认每一个网页的合法性。而从严格意义上来说,用户根本没有办法防止 CSRF 攻击。因此,我们只能从应用本身入手去加强防护。

    如何进行 CSRF 防护?

    方法一:行业内标准的 CSRF 防护方法是 CSRFToken

    通过前面的学习,我们知道,CSRF 是通过自动提交表单的形式来发起攻击的。所以,在前面转账的例子中,黑客可以通过抓包分析出 http://bank.com/transfer 这个接口所需要的参数,从而构造对应的 form 表单。因此,我们只需要在这个接口中,加入一个黑客无法猜到的参数,就可以有效防止 CSRF 了。这就是 CSRF Token 的工作原理。

    方法二:隐藏令牌:

    把 token 隐藏在 http 的 head头中

    方法三、Referer 验证:

    Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。

    SSRF:同样的原理,发生在服务端又会发生什么

    用户在浏览器中输入一个 URL(比如某个图片资源),然后服务端会向这个 URL 发起请求,通过访问其他的服务端资源来完成正常的页面展示。这个时候,只要黑客在输入中提交一个内网 URL,就能让服务端发起一个黑客定义的内网请求,从而获取到内网数据

    比方说,当我们在百度中搜索图片时,会涉及图片的跨域加载保护,百度不会直接在页面中加载图片的源地址,而是将地址通过 GET 参数提交到百度服务器,然后百度服务器请求到对应的图片,再返回到页面展示出来。

    这个过程中,百度服务器实际上会向另外一个 URL 地址发起请求。利用这个代理发起请求的功能,黑客可以通过提交一个内网的地址,实现对内网任意服务的访问。这就是 SSRF 攻击的实现过程,也就是我们常说的“内网穿透”

    通过 SSRF 攻击,黑客能做什么?

    1. 内网探测

    2. 文件读取

    如何进行 SSRF 防护?

    白名单的限制永远是最简单、最高效的防护措施

    对协议和资源类型等进行限制

    请求端限制

  • 相关阅读:
    33.数组声明方式(var构造函数) 、检测数组类型、数组的属性(封装好的就一个length)、数组的方法
    31.this指向(写出调用链,找最近对象) this的默认绑定 隐式绑定 显示绑定(call(绑定对象) apply(绑定对象) 当括号内没放绑定对象的时候恢复默认绑定) bind
    31.
    30.函数作用域链 (GO AO 也叫词法作用域链)、 调用栈、调用栈涉及this绑定
    29.包装类(构造函数) 包装类作用及调用栈
    916. Word Subsets
    246. Strobogrammatic Number
    445. Add Two Numbers II
    2. Add Two Numbers
    341. Flatten Nested List Iterator
  • 原文地址:https://www.cnblogs.com/mysky007/p/12489608.html
Copyright © 2011-2022 走看看