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 防护?

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

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

请求端限制

原文地址:https://www.cnblogs.com/mysky007/p/12489608.html