🇰🇷 한글 설명
WordPress용 Amelia 플러그인 2.2 이하 버전에서 인증되지 않은 사용자가 고객 이름 필드를 통해 저장형 XSS 공격을 수행할 수 있는 취약점이 발견되었습니다. AddBookingCommand에서 논스(nonce) 검증을 건너뛰어 인증 우회가 가능하며, 관리자 페이지의 캘린더 뷰에서 고객 이름을 JavaScript 템플릿 리터럴에 직접 삽입하고 innerHTML로 렌더링할 때 악성 스크립트가 실행됩니다.
💡 쉬운 설명
예약 플러그인의 이름 입력란에 악성 코드를 적어 넣으면, 관리자가 예약 달력을 확인하는 순간 관리자의 권한을 탈취할 수 있는 보안 약점입니다. 공격자는 별도의 로그인 없이도 예약 정보를 조작하여 관리자 컴퓨터에서 위험한 동작을 실행시킬 수 있습니다.
🇺🇸 원문 (English)
The Booking for Appointments and Events Calendar – Amelia plugin for WordPress is vulnerable to Stored Cross-Site Scripting via customer name fields in versions up to and including 2.2. This is due to an authentication bypass where the AddBookingCommand explicitly skips nonce verification (Command.php line 186), allowing unauthenticated users to submit booking data. While the plugin applies sanitize_text_field() to customer firstName and lastName fields (BookingApplicationService.php lines 302-308), this function only removes HTML tags and preserves special characters including double quotes. The vulnerability manifests in the administrative Calendar view where a FullCalendar eventContent callback interpolates customer names directly into JavaScript template literals (redesign/dist/index.js line 199) and renders them via innerHTML without proper HTML entity encoding. Because double quotes are preserved, an attacker can inject payloads like '" onmouseover="alert(document.cookie)"' to break out of the title attribute and inject malicious event handlers. This makes it possible for unauthenticated attackers to inject arbitrary web scripts that will execute when an administrator accesses the Calendar page and hovers over the malicious appointment.
📍 영향받는 시스템
WordPress Amelia plugin versions up to and including 2.2
⚔️ 공격 벡터
인증되지 않은 사용자가 예약 시 고객 이름 필드에 악성 JavaScript 페이로드를 삽입하여 전송
🛡️ 대응 방법
Amelia 플러그인을 최신 보안 패치가 적용된 버전으로 업데이트하고, 입력값에 대한 HTML 엔티티 인코딩을 적용해야 함
🔧 검증 코드
출력 결과에 'amelia'가 포함되어 있는지 확인하고, 설치된 버전이 2.2 이하인지 체크하여 취약 여부를 판단합니다.
wp plugin list --status=active | grep -i 'amelia'