June 20

Технологический стек сайтов: Wappalyzer, BuiltWith, определение CMS и библиотек

Технологический стек сайтов: Wappalyzer, BuiltWith, определение CMS и библиотек

Веб-сайты редко создаются с нуля. Они собираются из компонентов: систем управления контентом (CMS), фреймворков, библиотек JavaScript, аналитических платформ, рекламных сетей и т.д. Знание технологического стека цели позволяет не только понять её архитектуру, но и выявить уязвимости (устаревшие версии WordPress, известные уязвимости jQuery), а также получить подсказки о бюджете, кадровом составе и используемых облачных сервисах. Определение стека возможно пассивно (по заголовкам, HTML-коду, паттернам) или активно (запросы к специальным файлам). Данная статья посвящена методам и инструментам идентификации технологий веб-сайтов.

Категории технологий, которые можно определить

Этап 1: Пассивное определение через HTTP-заголовки

Самый простой метод — отправить HTTP-запрос к сайту и проанализировать заголовки ответа.

Что дают заголовки:

  • Server — тип и версия веб-сервера (например, nginx/1.18.0).
  • X-Powered-By — технология бэкенда (PHP/7.4, ASP.NET).
  • X-CMS — иногда CMS указывает себя (редко).
  • Set-Cookie — может содержать идентификаторы CMS (например, wp-settings-1 для WordPress).
  • X-Drupal-Cache, X-Generator, X-Request-ID и др.

Инструменты для просмотра заголовков:

  • curl (командная строка): curl -I https://example.com
  • Browser DevTools (вкладка Network).
  • Online сервисы: SecurityHeaders.io, HTTPHeaderCheck.

Пример curl:

curl -I https://www.example.com

Анализ cookies:

  • PHPSESSID → PHP.
  • JSESSIONID → Java (JSP).
  • ASPSESSIONIDASP.NET.
  • wp-settings-*, wordpress_logged_in_* → WordPress.
  • laravel_session → Laravel.

Этап 2: Автоматические детекторы (Wappalyzer, BuiltWith, WhatRuns)

Wappalyzer — расширение для браузера (и CLI-инструмент), определяющее технологии по множеству сигнатур: HTML, JavaScript, заголовки, паттерны URL, meta-теги.

Как установить:

  • Расширение для Chrome/Firefox (бесплатно).
  • CLI-версия: npm install -g wappalyzer.

Использование CLI:

wappalyzer https://example.com

Пример вывода (сокращённо):

{
  "url": "https://example.com",
  "technologies": [
    {"name": "Nginx", "version": "1.18.0"},
    {"name": "PHP", "version": "7.4.33"},
    {"name": "WordPress", "version": "6.2"},
    {"name": "jQuery", "version": "3.6.0"},
    {"name": "Google Analytics", "id": "UA-12345678-1"}
  ]
}

BuiltWith — онлайн-сервис, который не только определяет технологии, но и показывает историю их использования, а также другие домены, использующие те же идентификаторы (например, Google Analytics ID). Платный API позволяет массовые запросы.

Как использовать BuiltWith бесплатно:

  • Ввести URL на builtwith.com.
  • Получить подробный отчёт: веб-сервер, CMS, аналитика, виджеты, хостинг, SSL-провайдер.

Что можно найти через BuiltWith:

  • Связанные сайты по общему Google Analytics ID или AdSense ID.
  • Пересечения по хостингу, IP.
  • Историю изменений технологий.

WhatRuns — аналог Wappalyzer, но с фокусом на библиотеки фронтенда. Есть веб-интерфейс и расширение.

Сравнение детекторов:

Этап 3: Определение CMS по характерным путям и файлам

Каждая CMS имеет уникальную структуру URL, файлы и мета-теги.

WordPress:

  • /wp-admin, /wp-content, /wp-includes
  • Generator мета-тег: <meta name="generator" content="WordPress X.X.X">
  • Файл /wp-login.php
  • Robots.txt часто содержит Disallow: /wp-admin/

Drupal:

  • /sites/default/files, /core, /modules
  • Generator мета-тег: <meta name="Generator" content="Drupal X (http://drupal.org)">
  • Страница /user/login

Joomla:

  • /administrator, /media, /components
  • Мета-тег: <meta name="generator" content="Joomla! - Open Source Content Management">
  • Robots.txt: Disallow: /administrator/

Bitrix (1С-Битрикс):

  • /bitrix, /bitrix/admin
  • /bitrix/tools, /bitrix/js
  • Мета-тег: редко указывает версию.

Tilda (тильда):

  • URL с project123456.tilda.ws или кастомный домен, но в коде есть //tilda.cc
  • Блоки .t396, .t-carousel

Этап 4: Определение версии CMS

Версия может быть указана в:

  • Meta-теге generator (WordPress, Drupal, иногда Joomla).
  • Файле readme.html или readme.txt в корне (WordPress, Drupal).
  • Странице /wp-admin/ в HTML-комментариях (WordPress).
  • Специфических файлах стилей (например, /wp-content/themes/twentytwenty/style.css содержит Version:).

Пример получения версии WordPress:

curl -s https://example.com/readme.html | grep -i "Version"

или

curl -s https://example.com/wp-content/themes/twentytwenty/style.css | grep -i "Version:"

Ограничения: версии могут быть скрыты или изменены.

Этап 5: Анализ фронтенд-библиотек

Библиотеки JavaScript часто оставляют следы в глобальных объектах, версиях в исходном коде, а также в путях к файлам.

Способы определения:

  • Браузерная консоль: ввести jQuery().jquery (если jQuery загружен), React.version, Vue.version.
  • Поиск в исходном коде страницы: //ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
  • Проверка на уязвимости: Retire.js (расширение для браузера) или CLI.

Retire.js CLI:

npm install -g retire
retire --url https://example.com

Этап 6: Определение хостинга и CDN

Хостинг:

  • whois IP покажет организацию.
  • BuiltWith в разделе "Hosting".
  • Поиск по IP в Shodan → раздел "org".

CDN:

  • Проверить наличие заголовка CF-Cache-Status (Cloudflare).
  • Наличие X-Cache, X-Cache-Hits (Akamai, AWS CloudFront).
  • CNAME записи: например, cdn.example.com CNAME cdn.shopify.com.

Список известных CDN:

  • Cloudflare (IP-диапазоны публикуются)
  • Akamai
  • Amazon CloudFront (.cloudfront.net)
  • Fastly
  • StackPath

Этап 7: Определение аналитических систем (Google Analytics, Yandex.Metrica)

Идентификаторы аналитики можно использовать для поиска других сайтов, принадлежащих той же организации.

Как найти ID:

  • Поиск в HTML-коде: UA-12345678-1 (Google Analytics Universal), G-XXXXXXXX (GA4).
  • Для Яндекс.Метрики: <meta name="yandex-verification" content="..."> или Ya.Metrika.informer.

Поиск по идентификатору через BuiltWith:

  • Ввести UA-12345678-1 в поисковую строку BuiltWith → список сайтов с этим ID.

Google Analytics ID может быть одинаковым для нескольких доменов одной компании.

Этап 8: Обнаружение скрытых директорий и файлов (active)

Это уже активный метод, но его можно использовать с разрешения. Инструменты: Dirb, Gobuster, FFUF.

Пример Gobuster:

gobuster dir -u https://example.com -w /usr/share/wordlists/dirb/common.txt

Что можно найти:

  • /phpmyadmin, /adminer, /pma — инструменты управления БД.
  • /git, /.git/config — утечка репозитория.
  • /backup, /old — старые версии сайта.
  • /api — API-эндпоинты.

Важно: не сканируйте чужие сайты без разрешения.

Этап 9: Объединение данных с другими источниками

Технологический стек дополняет картину, полученную из DNS, поддоменов и сканирования портов.

Практический пример: полный разбор веб-инфраструктуры

Задача: охарактеризовать сайт target.org.

  1. HTTP-заголовки:
    • Server: nginx/1.22.1
    • X-Powered-By: PHP/8.1.2
    • Set-Cookie: PHPSESSID=... → PHP.
  2. Wappalyzer:
    • CMS: Drupal 9.5
    • Фронтенд: jQuery 3.6.0, Bootstrap 4.6
    • Аналитика: Google Analytics (UA-12345678-1)
  3. BuiltWith:
    • Хостинг: Amazon AWS (us-east-1)
    • CDN: CloudFront
    • SSL: Let's Encrypt
    • Ecommerce: нет.
  4. Поиск по Google Analytics ID через BuiltWith:
    • Найдены ещё два сайта: other.target.org и blog.target.org. Оба на Drupal, тот же хостинг.
  5. Проверка версии Drupal:
    • /README.txt → Drupal 9.5.3.
    • /core/CHANGELOG.txt → подтверждает.
  6. Анализ фронтенда:
    • jQuery 3.6.0 (без уязвимостей).
    • Bootstrap 4.6 (устаревший, но не критично).
  7. CDN:
    • IP-адрес сайта скрыт за CloudFront (проверено через dig A target.org → IP принадлежит AWS CloudFront).
    • Но есть другие поддомены, указывающие на реальные IP (можно найти через SecurityTrails).
  8. Вывод: организация использует AWS с CloudFront, Drupal 9.5, имеет связанные сайты. Версия Drupal 9.5.x имеет несколько известных уязвимостей (CVE-2023-XXXX), требуется обновление. Google Analytics ID связывает три сайта, что указывает на единую структуру.

Автоматизация: сбор технологического стека через API Wappalyzer

import json
import requests

def wappalyzer_detect(url):
    # Wappalyzer CLI (если установлен) или можно использовать их API (платно)
    # Пример через subprocess
    import subprocess
    result = subprocess.run(['wappalyzer', url], capture_output=True, text=True)
    if result.returncode == 0:
        return json.loads(result.stdout)
    else:
        return None

def builtwith_lookup(url):
    # BuiltWith API (требуется ключ)
    api_key = "YOUR_API_KEY"
    endpoint = f"https://api.builtwith.com/free1/api.json?KEY={api_key}&LOOKUP={url}"
    resp = requests.get(endpoint)
    if resp.status_code == 200:
        return resp.json()
    return None

# Пример
tech = wappalyzer_detect("https://example.com")
print(json.dumps(tech, indent=2))
  • Определение технологического стека через пассивные методы (заголовки, HTML) — легально.
  • Активный поиск файлов (Dirb, Gobuster) — требует разрешения владельца.
  • Использование BuiltWith для поиска по ID (Google Analytics) легально, но может быть сочтено навязчивым, если используется для массового сбора данных.

Идентификация технологического стека — обязательный этап при исследовании веб-приложения. Wappalyzer и BuiltWith автоматизируют большую часть работы. Важно не только определить технологии, но и оценить версии (особенно устаревшие) и выявить связи по аналитическим идентификаторам. Эта информация может привести к обнаружению других активов организации. В связке с SSL-сертификатами, поддоменами и портами технологический стек закрывает ещё одну часть пазла внешней инфраструктуры.