
CVE-2026-56011을 재현하고 검증하기 위한 Docker 기반 랩, WordPress용 MapPress Maps의 인증되지 않은 XSS 취약점, 취약한 대상과 패치된 대상 비교.
이 저장소는 MapPress Maps for WordPress에 영향을 미치는 무인증 크로스사이트 스크립팅(Cross-Site Scripting) 취약점인 CVE-2026-56011을 재현하고 검증하기 위한 로컬 Docker 랩입니다.
MapPress Maps for WordPress는 WordPress 페이지와 게시물 내부에 지도를 렌더링하는 데 사용되는 WordPress 플러그인입니다. 취약한 동작은 mappress=embed 요청 매개변수를 통해 접근 가능한 iframe 지도 렌더링 경로에 영향을 미칩니다.
이 랩은 두 가지 MapPress 버전을 비교합니다:
| 서비스 | MapPress 버전 | 용도 | URL |
|---|---|---|---|
| vuln | 2.97.3 | 취약한 비교 대상 | http://localhost:8081 |
| patched | 2.97.4 | 패치된 비교 대상 | http://localhost:8082 |
이 로컬 랩에서 시연된 검증 경로는 다음과 같습니다:```text Unauthenticated browser request → GET /?mappress=embed → request supplies a crafted name value → vulnerable target renders name into an unquoted id attribute → injected onclick handler becomes a standalone HTML attribute → clicking the rendered MapPress component triggers alert(1) → patched target keeps the payload inside a quoted and escaped id attribute → clicking the rendered component does not trigger alert(1)
취약한 대상은 이 수동 브라우저 URL을 사용합니다:```text
http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
예상 취약 결과:```text Click on the rendered MapPress component → alert(1) pops up
패치된 대상은 MapPress 2.97.4에 대해 동일한 페이로드를 사용합니다:```text
http://localhost:8082/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
예상 패치 결과:```text Click on the rendered MapPress component → no alert appears
이 실습은 의도적으로 수동 브라우저 검증만 사용합니다. PoC 스크립트, 브라우저 자동화, 자격 증명 탈취, 외부 콜백, 악성코드, 지속성, 사후 침투 활동 또는 외부 시스템에 대한 공격은 포함하지 않습니다.
## 확인된 사실
| 주장 | 근거 | 이 실습에서 확인하는 방법 |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
| CVE-2026-56011은 MapPress Maps for WordPress에 영향을 미칩니다. | 공개 취약점 권고는 영향을 받는 WordPress 플러그인을 MapPress Maps for WordPress로 식별합니다. | 참고 자료 섹션을 검토하고 두 Docker 대상에 설치된 플러그인을 검사합니다. |
| 이 실습에서 취약한 비교 버전은 MapPress 2.97.3입니다. | `vuln` 서비스는 `MAPPRESS_VERSION: 2.97.3`을 사용하여 플러그인을 빌드합니다. | `docker-compose.yml`과 `vuln/Dockerfile`을 검사합니다. |
| 이 실습에서 패치된 비교 버전은 MapPress 2.97.4입니다. | `patched` 서비스는 `MAPPRESS_VERSION: 2.97.4`을 사용하여 플러그인을 빌드합니다. | `docker-compose.yml`과 `patched/Dockerfile`을 검사합니다. |
| MapPress 2.97.4는 관련 iframe 이스케이프 수정을 도입했습니다. | 2.97.4의 공식 플러그인 변경 로그에는 `Added: escape in iframe`이라고 나와 있습니다. | 공식 WordPress 플러그인 변경 로그를 검토하고 취약한 소스와 패치된 소스를 비교합니다. |
| 취약한 소스는 지도 이름을 따옴표 없이 웹 구성 요소 `id`에 렌더링합니다. | 2.97.3에서 `mappress_map.php`는 `<mappress-map id={$name} ...>`을 렌더링합니다. | 2.97.3 소스와 2.97.4 소스를 비교합니다. |
| 패치된 소스는 `id` 값을 따옴표로 묶고 이스케이프합니다. | 2.97.4에서 `mappress_map.php`는 `esc_attr($name)`과 함께 `id="`을 렌더링합니다. | 2.97.3과 2.97.4 간의 패치 diff를 비교합니다. |
| iframe 경로는 인증 없이 접근할 수 있습니다. | MapPress는 `$_GET['mappress']`가 있을 때 `template_redirect`를 등록합니다. | 로그인하지 않고 브라우저에서 `/?mappress=embed...`를 요청합니다. |
| iframe 경로는 요청에서 지도 속성을 읽습니다. | `template_redirect()`는 `$_GET`을 지도 인수에 매핑하고 iframe 렌더러를 호출합니다. | `mappress.php`를 검사하고 수동 URL을 재현합니다. |
| 취약한 대상은 `name`을 통한 속성 주입을 허용합니다. | 조작된 name 값은 따옴표 없는 `id` 속성에서 벗어나 `onclick=alert(1)`이 될 수 있습니다. | 취약한 수동 URL을 열고 렌더링된 MapPress 구성 요소를 클릭합니다. |
| 패치된 대상은 테스트된 속성 주입 동작을 차단합니다. | 패치된 출력은 전체 페이로드를 따옴표로 묶인 `id` 속성 안에 유지합니다. | 패치된 수동 URL을 열고 렌더링된 MapPress 구성 요소를 클릭합니다. |
## 가정 및 미지의 사항
이 실습은 공개 권고가 2.97.3 이하 버전을 영향을 받는 것으로 식별하고, 소스 diff가 해당 버전에서 취약한 따옴표 없는 속성 렌더링을 보여주기 때문에 MapPress 2.97.3을 취약한 비교 대상으로 사용합니다.
이 실습은 공개 권고가 2.97.4를 수정된 버전으로 식별하고, 공식 변경 로그가 iframe 경로에 이스케이프가 추가되었다고 명시하기 때문에 MapPress 2.97.4를 패치된 비교 대상으로 사용합니다.
테스트된 취약한 동작은 인증되지 않은 iframe 렌더링 경로입니다:```text
GET /?mappress=embed&name=<crafted-value>
이 랩은 무해한 alert 페이로드를 브라우저에서 수동으로 실행하는 데 초점을 맞춥니다:```text name=cve56011 onclick=alert(1)
이 랩은 저장형 전달 체인을 입증하려 시도하지 않습니다. 일부 공개 보안 권고에서는 이 취약점을 저장형 XSS로 분류합니다. 이 저장소는 소스 코드에서 확인된 iframe 렌더링 싱크와, 인증되지 않은 `mappress=embed` 경로를 통해 로컬에서 재현할 수 있는 취약 버전과 패치 버전 간의 동작 차이에 초점을 맞춥니다.
이 랩은 다음을 시연하지 않습니다:
* 저장된 페이로드의 지속성,
* WordPress 계정 침해,
* 관리자 세션 탈취,
* nonce 탈취,
* 외부 콜백,
* 블라인드 XSS 수집,
* 자격 증명 탈취,
* 데이터베이스 덤프,
* 악성코드,
* 지속성,
* 또는 실험실 외 시스템에 대한 공격.
수동 브라우저 검증은 보안 관련 렌더링 차이를 입증합니다:```text
MapPress 2.97.3:
crafted name value becomes executable onclick attribute
MapPress 2.97.4:
crafted name value remains inside the quoted id attribute
CVE-2026-56011의 근본 원인은 MapPress가 iframe 맵 출력 경로 내부에서 웹 컴포넌트를 렌더링할 때 맵 name 값에 대한 출력 인코딩이 잘못된 것입니다.
취약한 코드 경로는 요청의 맵 렌더링 속성을 받아들여 결국 사용자 정의 HTML 요소를 렌더링합니다:```html <mappress-map ...>
MapPress 2.97.3에서 맵 이름은 따옴표 없이 그리고 속성 컨텍스트 이스케이프 없이 `id` 속성에 직접 삽입됩니다:```php
return "<div></div>\r\n<mappress-map id={$name} {$atts}>\r\n$pois\r\n</mappress-map>\r\n";
이것은 값이 HTML 속성 컨텍스트에서 사용되므로 안전하지 않습니다. 공격자가 name을 제어할 수 있다면, 공백을 포함한 값은 의도된 id 값을 종료시키고 새 속성을 삽입할 수 있습니다.
취약한 동작은 다음과 같이 요약할 수 있습니다:```text Attacker sends unauthenticated iframe request → name = cve56011 onclick=alert(1) → MapPress sanitizes the value as text → sanitized text is still unsafe for an unquoted HTML attribute → renderer outputs id=cve56011 onclick=alert(1) → onclick becomes a standalone event handler attribute → user clicks the rendered component → JavaScript executes
중요한 점은 일반적인 텍스트 정화(sanitization)는 올바른 출력 이스케이프(escaping)와 동일하지 않다는 것입니다.
취약한 코드는 맵 이름에 `sanitize_text_field()`를 사용하지만, 이는 값을 따옴표로 묶지 않은 HTML 속성에 안전하게 만들지 않습니다.
HTML 속성에서 공백은 속성과 속성을 구분하기 때문에 여전히 의미를 지닙니다.
따라서 보안 문제는 다음과 같습니다:```text
User-controlled input
+ unquoted HTML attribute context
+ missing esc_attr()
= attribute injection and XSS
패치된 버전은 렌더링 시 id 값을 따옴표로 묶고 이스케이프하도록 변경합니다:```php
return "
패치된 동작은 다음과 같이 요약할 수 있습니다:```text
Attacker sends the same crafted name value
→ MapPress renders id="cve56011 onclick=alert(1)"
→ onclick remains text inside the id value
→ no standalone event handler attribute is created
→ clicking the component does not execute alert(1)
보안 교훈은 다음과 같습니다:```text Sanitize on input if needed, but always escape on output for the exact output context. For HTML attributes in WordPress, use esc_attr() and quote attribute values.
## 소스 코드 분석
소스 수준의 문제는 MapPress 2.97.3과 MapPress 2.97.4를 비교하여 확인되었습니다.