Post

[CVE-2024-8236] 취약점 분석 보고서

CVE-2024-8236 Elementor Website Builder 플러그인에서 발생하는 Stored XSS 취약점

1. CVE-2024-8236란?

CVE ID: CVE-2024-8236
CVSS 심각도 점수: 6.4
영향을 받는 버전: ≤ 3.25.7

WordPress용 Elementor Website Builder 플러그인은 3.25.7 이전 모든 버전에서 아이콘 위젯의 ‘url’ 매개변수를 통한 Stored XSS에 취약하다. 이는 입력 살균 및 출력 이스케이핑이 충분하지 않기 때문으로, 이를 통해 Contributor 수준 이상의 액세스 권한이 있는 인증된 공격자가 사용자가 삽입된 페이지에 액세스할 때마다 실행되는 임의의 웹 스크립트를 페이지에 삽입할 수 있다.

CVE-2024-8236

2. 환경구축

XAMPP 3.3.0, Wordpress 6.6.2, Elementor 3.25.7

image.png

Elemetor을 사용하면 icon 위젯을 사용할 수 있다

image.png

3. 분석

해당 버전의 상위버전인 3.25.8버전의 패치 내역을 보면 link 초기화 부분의 차이를 볼 수 있다. image.png

1
2
// 3.25.7
const link = settings.link.url ? 'href="' + elementor.helpers.sanitizeUrl( settings.link.url ) + '"' : '',

3.25.7 버전의 link의 href는 단순 문자열로 추가된다.

이는 3.25.7 버전의 코드가 sanitizeUrl함수로 검증을 하지만 단순히 문자열로 연결하기 때문에 필터링 되지않은 값으로 문자열 조작 공격에 취약하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protected function content_template() {
		?>
		<#
		if ( '' === settings.selected_icon.value ) {
			return;
		}

		const link = settings.link.url ? 'href="' + elementor.helpers.sanitizeUrl( settings.link.url ) + '"' : '',
				iconHTML = elementor.helpers.renderIcon( view, settings.selected_icon, { 'aria-hidden': true }, 'i' , 'object' ),
				migrated = elementor.helpers.isIconMigrated( settings, 'selected_icon' ),
				iconTag = link ? 'a' : 'div';
		#>
		<div class="elementor-icon-wrapper">
			<} class="elementor-icon elementor-animation-" }>
				<# if ( iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
					}
				<# } else { #>
					<i class="" aria-hidden="true"></i>
				<# } #>
			</}>
		</div>
		<?php
	}

해당 코드를 포함하는 content_template 함수는 글을 편집할 때 icon 위젯의 속성 값이 변경되면 호출된다.

그 후, {{{ link }}}는 초기화된 link값을 동적으로 보여주는 부분으로 값이 변경될 때 마다 호출된다.

4. POC

icon을 생성한 뒤 링크 속성에 “ onmouseover=alert(0) style=” 값을 넣어준 뒤 공개 처리해준다.

image.png

그러면 해당 게시물을 확인해보면 아래와 같은 a태그로 작성되어 XSS가 발생되지 않는다.

image.png

이는 해당 a태그를 게시글에서 랜더링하는 코드를 보면 add_link_attributes함수로 필터링 되어 게시물에서는 안전하다.

1
2
3
4
5
if ( ! empty( $settings['link']['url'] ) ) {
			$this->add_link_attributes( 'icon-wrapper', $settings['link'] );

			$icon_tag = 'a';
		}

하지만 그 후 다른 상위 권한을 가진 사용자가 해당 글을 편집하려고 icon 속성 값을 수정하는 순간

아래와 같은 a태그 속성 값이 }로 인해 호출되어 사진 1 과 같았던 a태그 값이 동적으로 변경되므로 안전하게 필터링 되지 않은 link값으로 변경되게된다.

image.png
1.변경 전

image.png

  1. 변경 후

image.png

그러면 해당 icon에 마우스를 올리는 순간 XSS가 발생되게 된다.

5. 패치

1
2
3
4
5
6
7
// 3.25.8
let link = '';

		if ( settings.link.url ) {
			view.addRenderAttribute( 'link_url', 'href', elementor.helpers.sanitizeUrl( settings.link.url ) );
			link = view.getRenderAttributeString( 'link_url' );
		}

3.25.8 버전에서는 addRenderAttribute함수를 통해 link_url의 href 속성을 추가한 후 getRenderAttributeString 매서드로 이 속성 값을 가져와 link 변수에 저장한다.

This post is licensed under CC BY 4.0 by the author.