米游社图片接口和域名的解读及对象存储业务的反思

前一阵子,有网友提到了一个来自阿里云对象存储域名的URL:

https://plat-sh-community-prod-upload-ugc.oss-cn-shanghai.aliyuncs.com

虽然URL的后缀是.jpg,但实际上可以上传任意文件,且据说可以支持高达5GB的文件上传。

相关来源:

经过两周的讨论分析,我已经确定了此URL的来源——米哈游的米游社图片上传接口。

解析米游社图片上传接口

米游社的上传接口为:

https://bbs-api.miyoushe.com/apihub/wapi/getUploadParams

这是一个用于预检和获取上传URL的接口,也是此次漏洞利用的核心。该接口返回的信息包括:

  • expire: 30该参数表示签名的有效期。在签名过期后,无法继续使用该URL进行上传。单位未知,但推测为秒或分钟。该有效期类似于S3预授权URL,30分钟的有效期可能更为合理。
  • host: "https://plat-sh-community-prod-upload-ugc.oss-cn-shanghai.aliyuncs.com"上传目标地址为阿里云OSS。
  • dir: "upload/2024/10/04/XXX/"这是文件存储的目录路径,其中XXX为米游社的用户ID。可以通过访问https://www.miyoushe.com/ys/accountCenter/postList?id=获取该IDd的主页。

上传机制分析

上传操作为二进制上传,具体方式是通过HTTP PUT请求将文件的二进制数据逐块发送到指定的URL。值得注意的是,上传后的文件无法修改,因为上传的URL是通过预授权获取的。

域名分析

在对域名的分析中,最初的URL并未找到根源。有网友指出该域名与mhy有关,但米游社中使用的域名并不一致。最终确认是由不同的桶和CDN配置导致的。例如,网友提供的一个URL示例:

https://plat-sh-community-prod-upload-ugc.oss-cn-shanghai.aliyuncs.com/upload/2024/09/18/437001026/c2c88467d68be254cde987eb96222c0c_8789320676353527728.jpg

在米哈游展示的域名实际上为:

https://upload-bbs.miyoushe.com/upload/2024/09/18/437001026/c2c88467d68be254cde987eb96222c0c_8789320676353527728.jpg

至于域名问题,当时最终的URL在网上流传并没有找到根源,有网友指出是mhy,但当时我去米游社看了下发现域名不一致,后来网友指出是一个桶一个CDN,测试后发现确实如此,CDN拉桶需要时间,速度不是很快,估计就千兆甚至百兆。

 

漏洞利用的根源

通过直接访问https://upload-bbs.miyoushe.com,可以暴露桶ID,配合相对简单的URL结构,成为了此次对象存储漏洞被利用的原因之一。

所以在网上就没看见这个域名,而为什么会被人发现就是因为直接访问 https://upload-bbs.miyoushe.com 会漏桶ID,再加上过于幼稚的URL设计,是对象存储设计的反面典型。

安全反思

此次事件是对象存储设计不合理的典型案例,尤其体现在:

  • URL结构过于明显,缺乏混淆处理。
  • 反向代理和CDN的设计存在不足 ,导致信息暴露。
  • 虽然可能存在一定的CORS策略和防盗链,但这些措施已被证明不够有效,因用户可以直接通过URL访问资源。

唯一的技术壁垒可能在于米游社登录的逆向授权。虽然我没有进行深入逆向分析,但估计一些逆向技术可以获取上传URL并通过开发接口进行文件上传。不过,几年前的mhy签到那么多,估计现在基本还能用,我几年没碰mhy游戏了所以不知道啥情况,我估计是别人还是用了这个逆向方案来获取上传URL并开发接口进行上传的。

结论

米哈游的对象存储设计漏洞揭示了安全设计中常见的错误。要解决此问题,可能需要更换存储桶名称或重新设计URL结构,但这将带来较大的挑战。

  • alipay_img
  • wechat_img
最后更新于 2024-10-04