🇰🇷 한글 설명
WordPress용 GeoDirectory 플러그인(버전 2.8.199 이하)에는 리스팅 설명(post_content) 저장 시 입력값 정제가 불충분하여 저장형 XSS 취약점이 존재합니다. 구독자 이상 권한을 가진 인증된 공격자가 data-bs-content 속성에 악성 스크립트를 삽입할 수 있으며, 팝오버 렌더링 시 HTML로 해석되어 해당 페이지를 방문하는 사용자에게서 스크립트가 실행됩니다.
💡 쉬운 설명
구독자 권한을 가진 사용자가 게시물 설명에 악성 코드를 숨길 수 있습니다. 다른 사람이 그 페이지를 열면 해당 코드가 브라우저에서 실행되어 개인정보 탈취 등의 피해가 발생할 수 있습니다.
🇺🇸 원문 (English)
The GeoDirectory – WP Business Directory Plugin and Classified Listings Directory plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the listing description (post_content) in versions up to, and including, 2.8.199 This is due to insufficient input sanitization on save (the bundled geodir_kses_safe_embed_attributes() helper only neutralises data-embed-url, data-src and data-embed, while WordPress core wp_kses_post permits data-* attributes on standard HTML tags) combined with the AyeCode UI library initializing every [data-bs-toggle="popover-html"] element with { html: true, sanitize: false }, which inserts the attacker-controlled data-bs-content value into the popover body as HTML at render time. This makes it possible for authenticated attackers, with Subscriber-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.
📍 영향받는 시스템
GeoDirectory 플러그인 2.8.199 이하 버전이 설치된 WordPress 사이트
⚔️ 공격 벡터
구독자 이상 권한으로 리스팅 설명에 data-bs-content 속성 기반 악성 스크립트를 삽입하여 저장형 XSS 유발
🛡️ 대응 방법
GeoDirectory 플러그인을 2.8.199 초과 최신 버전으로 업데이트하고, 업데이트 전까지 구독자 등 낮은 권한 사용자의 리스팅 작성 권한을 제한
🔧 검증 코드
출력된 버전이 2.8.199 이하이면 취약하므로 업데이트가 필요하며, 2.8.199 초과이면 패치가 적용된 것입니다.
wp plugin list --name=geodirectory --field=version 2>/dev/null || grep -m1 'Version' wp-content/plugins/geodirectory/geodirectory.php 2>/dev/null