본문 바로가기
One-day 취약점 분석

[CVE-2024-8236] One-day 취약점 분석

by jh117jh 2024. 12. 3.
728x90

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 수준 이상의 액세스 권한이 있는 인증된 공격자가 사용자가 삽입된 페이지에 액세스 할 때마다 실행되는 임의의 웹 스크립트를 페이지에 삽입할 수 있다.

 

https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/elementor/elementor-website-builder-more-than-just-a-page-builder-3257-authenticated-contributor-stored-cross-site-scripting

 

Elementor Website Builder – More than Just a Page Builder <= 3.25.7 - Authenticated (Contributor+) Stored Cross-Site Scripting

Description The Elementor Website Builder – More than Just a Page Builder plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the ‘url’ parameter of the Icon widget in all versions up to, and including, 3.25.7 due to insufficient in

www.wordfence.com

 

2. 환경구축

 

XAMPP 3.3.0, Wordpress 6.6.2, Elementor 3.25.7

 

 

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

 

 

3. 분석

 

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

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

 

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

 

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

 

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">
			<{{{ iconTag }}} class="elementor-icon elementor-animation-{{ settings.hover_animation }}" {{{ link }}}>
				<# if ( iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
					{{{ iconHTML.value }}}
				<# } else { #>
					<i class="{{ settings.icon }}" aria-hidden="true"></i>
				<# } #>
			</{{{ iconTag }}}>
		</div>
		<?php
	}

 

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

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

 

4. POC

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

 

 

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

 

 

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

 

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

			$icon_tag = 'a';
		}

 

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

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

 

1. 변경 전
2. 변경 후

 

 

 

 

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

 

5. 패치

// 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 변수에 저장한다.

728x90