Технологический стек сайтов: 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 -I https://www.example.com
PHPSESSID→ PHP.JSESSIONID→ Java (JSP).ASPSESSIONID→ ASP.NET.wp-settings-*,wordpress_logged_in_*→ WordPress.laravel_session→ Laravel.
Этап 2: Автоматические детекторы (Wappalyzer, BuiltWith, WhatRuns)
Wappalyzer — расширение для браузера (и CLI-инструмент), определяющее технологии по множеству сигнатур: HTML, JavaScript, заголовки, паттерны URL, meta-теги.
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, файлы и мета-теги.
/wp-admin,/wp-content,/wp-includesGeneratorмета-тег:<meta name="generator" content="WordPress X.X.X">- Файл
/wp-login.php - Robots.txt часто содержит
Disallow: /wp-admin/
/sites/default/files,/core,/modulesGeneratorмета-тег:<meta name="Generator" content="Drupal X (http://drupal.org)">- Страница
/user/login
/administrator,/media,/components- Мета-тег:
<meta name="generator" content="Joomla! - Open Source Content Management"> - Robots.txt:
Disallow: /administrator/
Этап 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.
npm install -g retire retire --url https://example.com
Этап 6: Определение хостинга и CDN
- Проверить наличие заголовка
CF-Cache-Status(Cloudflare). - Наличие
X-Cache,X-Cache-Hits(Akamai, AWS CloudFront). - CNAME записи: например,
cdn.example.com CNAMEcdn.shopify.com.
Этап 7: Определение аналитических систем (Google Analytics, Yandex.Metrica)
Идентификаторы аналитики можно использовать для поиска других сайтов, принадлежащих той же организации.
- Поиск в HTML-коде:
UA-12345678-1(Google Analytics Universal),G-XXXXXXXX(GA4). - Для Яндекс.Метрики:
<meta name="yandex-verification" content="...">илиYa.Metrika.informer.
Поиск по идентификатору через BuiltWith:
Google Analytics ID может быть одинаковым для нескольких доменов одной компании.
Этап 8: Обнаружение скрытых директорий и файлов (active)
Это уже активный метод, но его можно использовать с разрешения. Инструменты: Dirb, Gobuster, FFUF.
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.
- HTTP-заголовки:
- Wappalyzer:
- BuiltWith:
- Поиск по Google Analytics ID через BuiltWith:
- Проверка версии Drupal:
- Анализ фронтенда:
- CDN:
- IP-адрес сайта скрыт за CloudFront (проверено через
dig A target.org→ IP принадлежит AWS CloudFront). - Но есть другие поддомены, указывающие на реальные IP (можно найти через SecurityTrails).
- Вывод: организация использует 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-сертификатами, поддоменами и портами технологический стек закрывает ещё одну часть пазла внешней инфраструктуры.