今天我要分享的是5万多个Shopify平台子域名劫持漏洞的发现过程。首先,我要说明的是,该漏洞不仅只存在于Shopify平台系统,还存在其它几个云服务平台系统中。在过去几周时间里,我们陆续联系了存在漏洞的各家厂商,Shopify平台的快速反应、认识透彻和持续跟进的处置能力给我们留下了深刻印象。
Shopify 是一个面向中小型企业的多渠道电商服务平台,它集建站、销售和宣传服务,帮助用户通过线上网店或社交媒体随时随地销售产品,Shopify 为全球 60 多万商家提供了线上服务,在高峰期每秒处理 8 万个请求。
在Shopify的域名测试中,如果遇到以下两种网页响应,那么目标网站就可能存在子域名劫持漏洞:
那接下来,如何来确定是否真的存在漏洞呢?
首先,需要来看两种DNS记录信息:
一种是网页应用名称映射,也就是myshopname.myshopify.com的域名别名记录;
另外就是看DNS映射,也就是shops.myshopify.com的域名别名记录。
当然,还有其它方法,我们在此不作详解。我们就来认真看看以上两种DNS记录信息。
该例子中,我们可以为指向buckhacker.shopify.com的shop.buckhacker.com映射设置一条别名记录(CNAME)。以下是对shop.buckhacker.com的nslookup信息:
如果在Shopify记录中,商店名称(像这里的buckhacker)http://bag.myshopify.com未被注册认领(claim),那么,我们可以注册认领它,然后进行子域名劫持测试。那如何知道某个商店名称是否被注册认领(claim)了呢?
在Shopify账号注册阶段,需要强制填写你的商店名称(Store Name),填写之后,那么Shopify将会把这个Store Name分配为其免费的二级域名地址,如你填写的Store Name是bag,其二级域名就是。在这里,如果你填写的商店名称是被别人注册过的,那么,系统会有提示。就像以下两种不可用和可用的商店名称注册状态:
在该过程中,如果我们开启了Burp抓包的话,可以看到一个发往 REST API的请求,以下两种操作分别对应了两种响应信息:
#1 Unavailable ({“status”:”unavailable”,”message”:null,”host”:”buckhacker.myshopify.com”})
#2 Available ({“status”:”available”,”message”:null,”host”:”buckhacker2.myshopify.com”})
这种方式,能简单测试某个商店名称是否可注册。为此,可以写个小脚本来跑跑,脚本下载https://github.com/buckhacker/SubDomainTakeoverTools。
该场景中,我们以之前我们注册的商店名buckhacker来做演示。如果这个过程中,我们发现某个商店名称是可继续注册的,那么,我们只需在Shopify管理面板中去连接它即可。也就是在如下管理后台中的 “Online Store” 下点击 “Domains”:
然后点击 “Connect existing domain”:
再在其中填写出可能存在漏洞的对应域名:
点击“Next” 和 “Verify Connection”:
这之后,会成功跳转到以下页面:
到了这步,就完成了Shopify的一个子域名劫持测试了。这种情况下,存在漏洞的原因就是,这条别名记录是存在的,而且商店名称是可注册的,这样子域名劫持漏洞很少见,因为你面对的目标是Shopify账号注册时要填写的商店名称,所以,其前提是,需要原来用户对之前的账户完全删除或执行域名变更,才有可能存在子域名劫持漏洞。经过调查,我们发现大约有2%的Shopify网站存在这样的错误配置问题。
在这个例子中,存在子域名指向shops.myshopify.com的一条CNAME记录,如:
这算是Shopify上常见的子域名劫持情况了,这种配置下,我们可以创建一个可注册的商店名,再按照像前述的测试方式,在Shopify管理后台中去连接管理其对应的域名。以下是其操作方式,如在我的后台中去连接sales.buckhacker.com:
成功连接后的确认:
在之前的文章中,我们介绍过使用Rapid7的Sonar和FDNS数据集工具可以很方便地进行一些漏洞测试利用。
Rapid7的FDNS数据集中包含了大量的CNAMES记录,所以,其实我们要做的就是在这个数据集中寻找CNAME指向shop.myshopify.com或者myshopname.shopify.com的子域名,围绕这两个域名的相关记录,再深入检查是否存在子域名劫持漏洞。
所有的漏洞测试步骤都可用一条命令来实现:
zcat $FDNS_DATASET | strings | grep shopify.com | cut -d “\”” -f 8 | grep -v “shopify.com” | while read subdomain; do python3 ShopifySubdomainTakeoverCheck.py $subdomain; done
这里,我们要解释一下,虽然存在其它子域名劫持漏洞的发现工具,但我们还是自行开发了这个工具来做测试,原因在于,其它工具都是基于Shopify的错误响应页面来检测的,这样会导致大量误报,在这些大量误报中仅有小部分是存在子域劫持漏洞的。我们的脚本和方式虽然简单,但执行了三种检查,即错误响应页面检查、CNAME记录检查和
REST API请求检查 ,最终运行结果相对于更加准确。
如果按照2017年版本的FDNSv2数据集来跑,最终的检测结果非常之多:大约有超过55,000个Shopify子域名存在子域名劫持漏洞。然后,从这些结果中,我们就可以对照数据来判断其它厂商的相关域名是否中招了。当然了,这种类似的漏洞检测方式,也可以适用于对其它域名注册提供商的检查。
这种方式的检测手段,可以大概了解某个目标厂商存在的子域名劫持漏洞情况。在云服务时代,除了传统的进程和堆栈的系统漏洞研究之外,还需要一些新的漏洞研究方法,提高思维高度宽度。抽象点说,整个云服务平台就是一个广泛的操作系统。
*参考来源:medium,clouds编译,转载来自FreeBuf.COM。
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.