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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-33331 — Локальная лаборатория, воспроизводящая хранимый XSS в генерации OpenAPI-документации oRPC (CVE-2026-33331), с уязвимой и исправленной версиями для сравнения и автономным PoC. | Kitploit
Инструменты/GitHubGitHub/abhayclasher/cve-2026-33331
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьОбучение и ОбразованиеЛаборатории и Практика
GitHubabhayclasher/cve-2026-33331

CVE-2026-33331

Локальная лаборатория, воспроизводящая хранимый XSS в генерации OpenAPI-документации oRPC (CVE-2026-33331), с уязвимой и исправленной версиями для сравнения и автономным PoC.

Репозиторий
4 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-33331 — Хранимый XSS в плагине OpenAPI Reference в oRPC

CVE GHSA CWE-79 Patched

Лабораторный стенд для воспроизведения хранимого XSS в генерации документации OpenAPI в orpc


Назначение

oRPC строит страницы документации API на основе спецификации OpenAPI. До версии v1.13.9 он вставлял спецификацию напрямую в тег <script> с помощью JSON.stringify() без HTML-кодирования. Любое поле, контролируемое атакующим, например , могло преждевременно закрыть этот тег и выполнить скрипт.

info.description

Этот репозиторий предоставляет локальный стенд для воспроизведения уязвимости, а также исправленную версию для сравнения.

Краткие факты

ПолеЗначение
CVE IDCVE-2026-33331
GHSAGHSA-7f6v-3gx7-27q8
CWECWE-79 (Некорректная нейтрализация входных данных при генерации веб-страницы)
Продуктmiddleapi/orpc
ЗатронутыВсе версии ниже v1.13.9
Исправленоv1.13.9
ОбнаружениеAbhay Kumar (@abhayclasher)

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

Уязвимый код в packages/openapi/src/plugins/openapi-reference.ts отображает спецификацию следующим образом:

root@kitploit:~
<script id="spec" type="application/json">${JSON.stringify(spec)}</script>

JSON.stringify() создаёт корректный JSON, но не экранирует символы < и >. Браузер по-прежнему воспринимает </script> как закрывающий HTML-тег, даже внутри <script type="application/json">.

Полезная нагрузка в info.description, которая запускает выполнение:

root@kitploit:~
"</script><script>alert('XSS')</script>"

Браузер видит:

root@kitploit:~
<script id="spec" type="application/json">{"info":{"description":"
</script><script>alert('XSS')</script>"}}
</script>

Первый </script> закрывает блок. Всё, что идёт после него, выполняется как встроенный JavaScript.

Влияние

  • Перехват сессии через кражу cookie или токенов
  • Произвольные вызовы API от имени жертвы, просматривающей документацию
  • Фишинговые оверлеи, отображаемые в доверенном домене документации

Это применимо, когда приложение строит спецификации OpenAPI из пользовательского ввода — именно тот случай, который oRPC обеспечивает через определения роутеров.

Системные требования

  • Node.js 18 или новее
  • Docker (опционально, для контейнерного стенда)
  • 500 МБ свободного дискового пространства

Установка

Вариант 1: Запуск напрямую

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-33331.git
cd CVE-2026-33331/app
npm install
node server.js

Вариант 2: Запуск с Docker

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-33331.git
cd CVE-2026-33331
docker compose up -d

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

После запуска сервера посетите следующие URL:

URLОписание
http://localhost:3000/docsУязвимая страница документации — XSS-нагрузка выполняется при загрузке
http://localhost:3000/docs/safeТа же страница с применённым патчем v1.13.9
http://localhost:3000/spec.jsonИсходная спецификация OpenAPI в формате JSON

Уязвимая версия вызовет alert() при загрузке страницы, подтверждая выполнение скрипта. Исправленная версия отображает ту же вредоносную спецификацию безопасно — нагрузка отображается как обычный текст.

Вы также можете запустить автономный PoC:

root@kitploit:~
cd poc
node exploit.js

Это запустит минимальный сервер на порту 3000, демонстрирующий ту же уязвимость без полного контекста приложения.

Как это работает

Поток обнаружения

root@kitploit:~
1. Атакующий контролирует поле в спецификации OpenAPI (например, description)
2. oRPC генерирует HTML документации с помощью JSON.stringify(spec)
3. </script> в нагрузке преждевременно закрывает тег <script>
4. Браузер выполняет всё, что следует далее, как встроенный JavaScript

Цепочка атаки

root@kitploit:~
┌─────────────────────────────────────────────────────┐
│  1. Создана вредоносная спецификация:                │
│                                                       │
│     info.description =                                │
│       "</script><script>alert('XSS')</script>"        │
│                                                       │
│  2. orpc встраивает спецификацию в HTML:              │
│                                                       │
│     <script id="spec" type="application/json">        │
│     {"info":{"description":"</script>    <-- тег      │
│       <script>alert('XSS')</script>      <-- нагрузка │
│       "}}                                             │
│     </script>                                         │
│                                                       │
│  3. Браузер выполняет alert('XSS')                    │
└─────────────────────────────────────────────────────┘

Исправление

Версия 1.13.9 вводит escapeJsonForHtml(), которая заменяет чувствительные к HTML символы на Unicode-экранирования перед встраиванием JSON в тег script:

root@kitploit:~
const escapeJsonForHtml = (obj) => JSON.stringify(obj)
  .replace(/&/g, '\\u0026')
  .replace(/'/g, '\\u0027')
  .replace(/</g, '\\u003C')
  .replace(/>/g, '\\u003E')
  .replace(/\//g, '\\u002F');

Unicode-экранирования работают, потому что остаются корректным JSON — JSON.parse() восстанавливает исходную строку — но при этом никогда не выглядят как HTML для парсера браузера.

Патч также перешёл от чтения JSON из атрибута DOM dataset.config (который ломался, когда значения содержали скобки) к прямому присваиванию экранированного JSON встроенной переменной.

Посмотреть полный коммит: 4f0efa8

Структура проекта

root@kitploit:~
CVE-2026-33331/
├── README.md               # Этот файл
├── docker-compose.yml      # Конфигурация Docker-стенда
├── app/
│   ├── Dockerfile          # Конфигурация сборки контейнера
│   ├── package.json        # Зависимости Node.js
│   └── server.js           # Рендерер документации (уязвимый + исправленный)
└── poc/
    └── exploit.js          # Автономный минимальный proof-of-concept

Ссылки

  • NVD — CVE-2026-33331
  • GitHub Security Advisory
  • Коммит с исправлением
  • Релиз v1.13.9
  • CWE-79

Сообщено Abhay Kumar. Этот репозиторий предназначен только для локального образовательного использования. Не разворачивайте уязвимый сервер в публичной сети.

Только в образовательных целях — используйте в изолированных средах

Скачать инструмент